Rawr
Rawr

Reputation: 2224

Subprocess.poll() falsely returns a value

test1.py:

process = Popen(["python","test2.py"])
time.sleep(3)

alive = process.poll()
if alive is None:
    print "Still running"
else:
    print "Not running\r\n"
    print "%r" % alive

test1.py Output:

Not running
2

test2.py:

time.sleep(30)
print "done"

What is going on? Shouldn't this return "Still running"?


Because of a contradicting result here's the full test1.py code:

import cStringIO
import os
import cgi
import time
from subprocess import Popen

def application(environ, start_response):
    headers = []
    headers.append(('Content-Type', 'text/plain'))
    write = start_response('200 OK', headers)

    input = environ['wsgi.input']
    output = cStringIO.StringIO()

    process = Popen(["python","test2.py"])
    time.sleep(3)

    alive = process.poll()
    if alive is None:
        print >> output, "Still running"
    else:
        print >> output, "Not running\r\n"
        print >> output, "%r" % alive

    output.write(input.read(int(environ.get('CONTENT_LENGTH', '0'))))
    return [output.getvalue()]

Updated test1.py:

process = Popen(["python","C:/wamp/www/python/popen/test2.py"], shell=True)
    time.sleep(5)

    alive = process.poll()
    if alive is None:
        #print >> output, "%r" % alive
        print >> output, "Still running"
    else:
        print >> output, "Not running"
        print >> output, "%r" % alive
        print >> output, "Current working dir : %s" % os.getcwd()
        print >> output, os.strerror(0)

Updated Output:

Not running
0
Current working dir : C:\wamp\bin\apache\apache2.2.22
No error

Upvotes: 6

Views: 3907

Answers (2)

Lie Ryan
Lie Ryan

Reputation: 64827

If Popen() cannot find test2.py, it produces the error "No such file or directory", with errno 2. This error number is returned by poll(). Since you seem to be running this script through wsgi, something seems to be gulping your stderr and you don't see the error message:

$ cat test1.py
from subprocess import Popen
import time

process = Popen(["python","doesnotexist.py"])
time.sleep(3)

alive = process.poll()
if alive is None:
    print "Still running"
else:
    print "Not running\r\n"
    print "%r" % alive
$ python test1.py 
python: can't open file 'doesnotexist.py': [Errno 2] No such file or directory
Not running

2

Now, the issue is probably because your current working directory of your script is not set to the script's directory by the front end server, try printing os.getcwd() to see if it's what you're expecting.

Upvotes: 7

primehunter326
primehunter326

Reputation: 2902

According to this

An exit status of 2 indicates an issue with the shell executing the command. Have you tried running test2.py directly in the shell to verify there aren't issues with it? As Lie pointed out it could be that the shell can't find the file you're trying to execute, though there could be another issue causing it to break.

Upvotes: 1

Related Questions