2012-04-08 11 views
6

Mam skrypt w języku Python, który zarządza serią zadań CasperJS i przetwarza wynik. To działa dobrze z wiersza polecenia, ale gdy uruchamiam skrypt w cron, pojawia się błąd:Podproces Pythona zwraca niezerowy status wyjścia tylko w cronie

CalledProcessError: Command '['/path/to/casperjs', '/path/to/doSomething.js', 'args']' returned non-zero exit status 1 

W Pythonie, wzywam CasperJS:

response = subprocess.check_output(['/path/to/casperjs', '/path/to/doSomething.js', 'args'], shell=True) 

Próbowałem shell=False i Popen jako dobrze, ale mam taki sam rezultat. Próbowałem również uczynić całe polecenie ciągiem (zamiast listy), ale to też nie pomogło.

Uruchamianie '/path/to/casperjs /path/to/doSomething.js args' zwraca kod wyjścia 0 po uruchomieniu w powłoce.

Dodałem również PATH=/usr/bin:/bin:/sbin:/usr/local/bin do mojego crontabu bez skutku. (Zgodnie z sugestią this question.)

Jakieś pomysły, dlaczego dostaję tylko ten błąd w cronie? Dzięki!!

EDIT: Zgodnie z poniższą odpowiedź, ustawienie shell=False i stderr=subprocess.STDOUT wykonaną pracę wszystkim ...

Odpowiedz

8

Należy starać się przechwycić stderr oprócz stdout, dzięki czemu można dowiedzieć się dokładnie, dlaczego program jest braku (zakładając, że rzeczywiście można wydrukować kilka błędów dla Ciebie)

cmd = ['/path/to/casperjs', '/path/to/doSomething.js', 'args'] 
response = subprocess.check_output(cmd, 
       shell=True, 
       stderr=subprocess.STDOUT) 
+1

dodam do tego, że najczęstszą przyczyną „działa ta komenda kiedy uruchomić go ręcznie, ale nie pod cron/kierownik/nowobogackich/.. . "jest zmienną środowiskową - nie zawsze PATH - jest inna lub pominięta sol. – mattbornski

+1

Tak, sprawdzałem wszystkie zmienne środowiskowe, ale ustawiając 'shell = False' i dodając' stderr = subprocess.STDOUT', a teraz wszystko działa w magiczny sposób? !! – arboc7

+0

@mattbornski: Zgadzam się. To albo to, albo może proces ma problemy z działaniem pod jakimkolwiek użytkownikiem, w którym skonfigurowano crontab. Nie chciałem spekulować za dużo, ale raczej spróbuj ustalić, jaki jest prawdziwy błąd: – jdi

Powiązane problemy