2014-06-25 55 views
1

对不起,如果这是一个简单的问题,并已答复之前,但我无法找到任何地方。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 

在此先感谢

马特

+0

只需将调用放在'try' /'except'块中。请参阅[这里](https://docs.python.org/3.4/tutorial/errors.html#handling-exceptions)。 – dano

+0

摄像机1有一个尝试/除外块,但我收到相同的消息。难道我做错了什么? – matth9

+1

'除了FileNotFoundError():'是错误的。你不应该在这里给出一个(新创建的)异常实例,而是给出异常类本身。 – glglgl

回答

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'> 
+0

这不是它的工作原理在Python 3中,OP使用的是什么?NameError:name'a'未定义;处理上述异常期间,发生另一个异常:TypeError:捕获不能从BaseException继承的类是不允许的' – user4815162342

+0

我看,症状不一样,但问题的根源是一样的,对吧? –

+0

我刚刚试过这个删除()并收到相同的错误。 – matth9

1

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

感谢您的帮助!