在python子进程check_output中使用绝对路径的任何方法

时间:2017-04-25 12:38:25

标签: python

对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

2 个答案:

答案 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)