Popen 子进程异常
抱歉如果这个问题很简单,之前有人回答过,但我到处找都没找到。
我正在尝试监听UDP数据包,如果收到特定的数据包,就运行不同的批处理脚本。我已经成功实现了这个功能,但我发现如果Popen命令找不到文件,就会触发一个异常,导致脚本停止运行。理想情况下,我希望它能打印一条消息,然后继续监听其他数据包并对它们做出反应,只是给我们一个调试用的消息。以下是我使用的代码,我该怎么做呢?
if rxdata == "Camera 1":
from subprocess import Popen
try:
p = Popen("Camera 1.bat", cwd=r"C:\xxx")
stdout, stderr = p.communicate()
except FileNotFoundError():
print('Camera 1.bat not found')
elif rxdata == "Camera 2":
from subprocess import Popen
p = Popen("Camera 2.bat", cwd=r"C:\xxx")
stdout, stderr = p.communicate()
在这两个例子中,我收到了以下信息,脚本就关闭了。
Traceback (most recent call last):
File "C:\UDP Listener.py", line 42, in <module>
p = Popen("Camera 1.bat", cwd=r"C:\xxx")
File "C:\Python34\lib\subprocess.py", line 858, in __init__
restore_signals, start_new_session)
File "C:\Python34\lib\subprocess.py", line 1111, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] The system cannot find the file specified
提前感谢你
马特
2 个回答
1
你在使用 FileNotFoundError
的时候,不要加上括号(也就是说,不要去调用它,只需要用它的名字)。可以用 Python 2 来测试一下:
try:
b = a
except NameError():
print "NameError caught."
执行结果:
Traceback (most recent call last):
File "test.py", line 2, in <module>
b = a
NameError: name 'a' is not defined
比如说,OSError
是一种类型,而 OSError()
则是创建了这个类型的一个实例:
>>> type(OSError)
<type 'type'>
>>> type(OSError())
<type 'exceptions.OSError'>
1
奇怪的是,在我电脑上重新安装了Python之后,一切都正常运作了。我也不太清楚之前出了什么问题,但现在我运行代码时,如果遇到错误,代码会按预期打印出来。
谢谢你的帮助!