我正在一个可以像其他终端一样调用其他程序的终端上工作。我正在Windows上使用子进程。 我遇到了两个问题。
第一: 目前,我正在使用OSError处理使用subprocess.Popen时引发的所有错误。
它的代码在这里:
try:
subprocess.Popen([command])
except OSError:
print("'" + command[0] + "' is not recognised as a command, program or bterm file.")
当我输入python
时,它会正确打开命令行python。
当我输入asdfa
时,它返回错误。
问题是,当我输入python non-existent-file.py
时,出现同样的错误,而子参数成为问题。
我希望终端返回(null): can't open file 'test': [Errno 2] No such file or directory
,就像从cmd或bash调用它一样。
我如何区分这2个错误,同时保留自定义错误消息以了解文件何时不存在?
第二::每当我将多字参数传递到 subprocess.Popen
或subprocess.call
时,我都会自动遇到该错误,而我不会使用{{1 }}
我不想使用os.system()
,因为我无法使用它引发自定义错误。
我在做什么错了?
答案 0 :(得分:1)
子流程调用中的异常:
在新程序开始执行之前,子进程中引发的异常将在父进程中重新引发。 此外,该异常对象还有一个名为child_traceback的额外属性,该属性是一个字符串,其中包含从孩子的角度出发的回溯信息。
最常见的异常是 OSError 。 例如,在尝试执行不存在的文件时,就会发生这种情况。应用程序应为OSError异常做好准备。
如果使用无效参数调用Popen,将引发 ValueError 。
如果被调用的进程返回非零返回码,则check_call ()和 check_output ()将引发 CalledProcessError 。
您可以在以下位置找到更多信息: https://docs.python.org/2/library/subprocess.html#exceptions
您还可以在以下位置找到异常继承体系: https://docs.python.org/2/library/exceptions.html#exception-hierarchy
try:
output = subprocess.check_output("\\test.exe')
except subprocess.CalledProcessError as e:
print("Something Fishy... returncode: " + e.returncode + ", output:\n" + e.output)
else:
print("Working Fine:\n" + output)
答案 1 :(得分:1)
您可以首先借助shutil.which
测试可执行文件的存在。
if shutil.which(commands[0]):
try:
subprocess.Popen([commands])
except OSError as err:
print(err)
else:
print("'{}' is not recognised as a command, program or bterm file.".format(commands[0])
文档中提供了大量信息:https://docs.python.org/dev/library/subprocess.html可能会有所帮助。
编辑:感谢Auxilor
,展示了如何捕获输出