Python运行命令行

时间:2016-08-09 13:06:48

标签: python python-3.x

我试图运行命令行脚本。 我有 : command.py

import subprocess
proc = subprocess.Popen('python3 hello.py', stdout=subprocess.PIPE)
tmp = proc.stdout.read()
print(tmp)

和hello.py

print("hello")

但它返回错误

  

FileNotFoundError:[WinError 2]

如何运行命令和打印结果?

1 个答案:

答案 0 :(得分:2)

问题是Popen在您的路径中找不到python3

如果主要错误是找不到hello.py,则会在stderr(即未读取)中出现此错误

python: can't open file 'hello.py': [Errno 2] No such file or directory

您不会在subprocess中收到异常,因为python3已运行但未能找到要执行的python文件。

首先,如果你想运行一个python文件,最好避免在另一个进程中运行它。

但是,如果您仍然想要这样做,最好使用这样的参数列表来运行它,这样就可以正确处理空格并提供所有文件的完整路径。

import subprocess
proc = subprocess.Popen([r'c:\some_dir\python3',r'd:\full_path_to\hello.py'], stdout=subprocess.PIPE)
tmp = proc.stdout.read()
print(tmp)

更进一步:

  • 对于python3,最好将其放在系统路径中以避免指定完整路径。
  • 对于脚本,如果它位于同一目录和当前脚本中,则可以避免硬编码路径

改进的代码段:

import subprocess,os
basedir = os.path.dirname(__file__)
proc = subprocess.Popen(['python3',os.path.join(basedir,'hello.py')], stdout=subprocess.PIPE)
tmp = proc.stdout.read()
print(tmp)

另外:Popen执行传递的第一个参数的execvp种。如果传递的第一个参数是,例如,.bat文件,则需要添加cmd /c前缀或shell=True以告诉Popen在shell中创建进程而不是执行直接。