对python来说,我发现子进程的check_output在Windows上运行得很好,但它似乎只运行了windows PATH env变量中的cmds。
我可以执行以下罚款:
import sys
from subprocess import check_output
cmd = check_output("ipconfig", shell=True)
print(cmd.decode(sys.stdout.encoding))
和ipconfig输出显示正常。
如果我尝试运行不在路径中的特定命令并尝试绝对路径,我会收到错误。
import sys
from subprocess import check_output
cmd = check_output("c:\\test\\test.exe", shell=True)
print(cmd.decode(sys.stdout.encoding))
是否无法为check_output使用绝对路径引用?我没有找到任何......
我甚至尝试过更改到该目录..
import sys
from subprocess import check_output
import os
os.chdir("c:\\test\\")
cmd = check_output("test.exe", shell=True)
print(cmd.decode(sys.stdout.encoding))
但是我收到以下错误
File "C:\Python35\lib\subprocess.py", line 398, in run
output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command 'naviseccli.exe' returned non-zero exit status 1
Process finished with exit code 1
答案 0 :(得分:1)
请阅读CalledProcessError
的文档。
您可以通过在try ... except
块中捕获此异常并使用异常实例的output
属性来检查输出。
try:
... ... # Running the command.
except CalledProcessError as cmderr:
print (cmderr.output) # Example of using the output.
通过这种方式,您可以检查失败命令的退出状态和输出。我不知道触发确切错误的原因,但使用绝对路径的结果不太可能。
答案 1 :(得分:1)
Popen提供了一个' cwd'参数,将在定义的目录中执行:
import subprocess
cmd = subprocess.Popen('test.exe', stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd='C:/test', shell=True)
out, err = cmd.communicate()
print (out)
使用check_output:
subprocess.check_output('cd C:/windows && notepad.exe', shell=True)