【问题标题】:Popen subprocess exception弹出子进程异常
【发布时间】:2014-06-25 14:21:23
【问题描述】:

对不起,如果这是一个简单的问题并且之前已经回答过,但我在任何地方都找不到。

我正在尝试侦听 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

提前致谢

马特

【问题讨论】:

  • 只需将调用放在try/except 块中即可。见here
  • 相机 1 有一个 try / except 块,但我收到相同的消息。我做错了吗?
  • except FileNotFoundError(): 是错误的。您不应该在这里给出异常的(新创建的)实例,而应该给出异常类本身。
  • @glglgl 这里有问题;运行类似try: raise FileNotFoundError except FileNotFoundError() 的东西会导致TypeError: catching classes that do not inherit from BaseException is not allowed。 OP 没有收到此异常可能表明 try 块内的调用没有被执行。
  • @user4815162342 因为回溯包含 Popen("Camera 1.bat", 代码被执行。奇怪,也许他甚至在不知情的情况下使用 Python 2 来生成此回溯。

标签: python exception python-3.x popen


【解决方案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'>

【讨论】:

  • 这不是它在 OP 使用的 Python 3 中的工作方式。你得到的是NameError: name 'a' is not defined; During handling of the above exception, another exception occurred: TypeError: catching classes that do not inherit from BaseException is not allowed
  • 我明白了,症状不同,但问题的根源是一样的,对吧?
  • 我刚刚尝试删除 () 并收到相同的错误。
  • @matth9 那么请注意回溯中提供的行号,看看错误是否是由您在此处显示的那些行触发的。
  • try: 是第 42 行,p = Popen("Camera 1.bat", cwd=r"C:\xxx") 是第 43 行
【解决方案2】:

奇怪的是,在我的电脑上重新安装 python 后,现在一切正常。不知道出了什么问题,但是当我现在运行代码并发现异常时,代码会按预期打印。

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多