2012-08-10 11 views
6

test1.py:Subprocess.poll() fałszywie zwraca wartość

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 wyjściowych:

Not running
2

test2.py:

time.sleep(30) 
print "done" 

Co się dzieje? Czy to nie powinno powrócić "Wciąż działa"?


Ze względu na wprost przeciwko wyniku oto pełny kod test1.py:

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 wyjściowa:

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

+0

Działa dobrze dla mnie. Moje wyniki to 'Still Running'. – RanRag

+0

da fuq ... cóż, mam nowy problem. Jakieś pomysły? Dodaję więcej kodu ... BTW Myślałem, że to dziwne, bo nie gdzie w moich wyszukiwaniach znalazłem "2" jako wynik dla ankiety(). – Rawr

+0

Ten sam wynik z RanRag, mam również "Jeszcze działa". –

Odpowiedz

7

Jeśli Popen() nie może znaleźć test2.py, wytwarza się błąd "Nie ma takiego pliku lub katalogu", z errno 2. Ten numer błędu jest zwracany przez sondzie(). Ponieważ wydaje się być uruchomiony ten skrypt poprzez WSGI, coś wydaje się być połykając swój stderr i nie pojawi się komunikat o błędzie:

$ 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 

Teraz problem jest prawdopodobnie dlatego, że bieżący katalog roboczy skryptu jest nie jest ustawione w katalogu skryptu przez serwer frontonu, spróbuj wydrukować os.getcwd(), aby sprawdzić, czy jest to oczekiwane.

+0

Miałem zamiar wskazać, że 'test2.py' nie wydaje się importować modułu' time', podczas gdy może to być również błąd, to jest bardziej bezpośrednia przyczyna Twojego problemu – chepner

+1

+1, pobaw mnie, że to wpisuję. Jeśli próbujesz znaleźć kod wyjścia, możesz wypróbować funkcję '' os.strerror() '', aby sprawdzić, czy daje sensowną wiadomość: '' >> import os >> os.strerror (2) '' daje komunikat '' 'Brak takiego pliku lub katalogu'''. – Blair

+0

wypróbował 'http: // localhost: 1234/python/popen/test2.py' oraz' C: \ wamp \ www \ python \ popen \ test2.py' sam błąd ... – Rawr

1

Według this

status błędu 2 pojawia się problem ze skorupą wykonującego polecenie. Czy próbowałeś już uruchomić test2.py bezpośrednio w powłoce, aby sprawdzić, czy nie ma z nią problemów? Jak zauważył Lie może się zdarzyć, że powłoka nie znajdzie pliku, który próbujesz wykonać, chociaż może być inny problem powodujący jego uszkodzenie.