Popen 子进程异常

1 投票
2 回答
2510 浏览
提问于 2025-04-18 11:02

抱歉如果这个问题很简单,之前有人回答过,但我到处找都没找到。

我正在尝试监听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之后,一切都正常运作了。我也不太清楚之前出了什么问题,但现在我运行代码时,如果遇到错误,代码会按预期打印出来。

谢谢你的帮助!

撰写回答