user3775523
user3775523

Reputation:

Popen subprocess exception

Sorry if this is a simple question and has been answered before, but I couldn't find it anywhere.

I'm trying to listen to UDP packets and if they are certain packets, run different batch scripts. I have this working correctly, but I have found that if the Popen command doesn't find the file it triggers an exception and the script stops running. Ideally, I want this to print a message and then continue listening for other packets and act upon them, just giving us a message for debugging. Here is the code I have used, how could I do this?

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()

In both examples, I receive the following and the script closes.

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

Thanks in advance

Matt

Upvotes: 1

Views: 2587

Answers (2)

user3775523
user3775523

Reputation:

Strangely, after re-installing python on my PC everything is now working correctly. Not sure what went wrong but when I run the code now and an exception is found then the code prints as expected.

Thanks for your help!

Upvotes: 1

Dr. Jan-Philip Gehrcke
Dr. Jan-Philip Gehrcke

Reputation: 35826

You must not use the brackets behind the FileNotFoundError (don't call it, just "name" it). Test (with Python 2):

try:
    b = a
except NameError():
    print "NameError caught."

Execution:

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    b = a
NameError: name 'a' is not defined

For instance, OSError is a type, whereas OSError() creates an instance of this type:

>>> type(OSError)
<type 'type'>
>>> type(OSError())
<type 'exceptions.OSError'>

Upvotes: 1

Related Questions