2012-01-20 16 views
12

Używam pary programów Pythona, z których jedna powinna wywoływać drugą.Wywołaj podprogram Pythona jako demona i zakończ

Ale należy to zrobić w taki sposób, aby pierwszy program uczynił z drugiego demona (lub działającego w tle), a następnie kończy pracę, nie czekając na zakończenie drugiego programu.

Czy to możliwe w języku Python?

Szukałem na os.fork, moduł subprocess, ale jestem zupełnie zdezorientowany właściwej drodze do osiągnięcia tego ...

Odpowiedz

10

Można użyć subprocess.Popen dla tego:

import subprocess 

cmd = ['/usr/bin/python', '/path/to/my/second/pythonscript.py'] 
subprocess.Popen(cmd) 

Możesz chcieć przekierować gdzieś na przykład stdout i stderr, można to zrobić, przekazując stdout=<file_obj> do konstruktora Popen.

+1

Tak, zgodnie z tym, "daemon_process" powinno być równe coś takiego jak "/ usr/bin/pyton/path /to/my/second/pythonscript.py"? –

+0

@JavierNovoaC. 'Popen' pobiera listę argumentów. Będę edytować moją odpowiedź, aby wyjaśnić. –

+0

dzięki! to zadziałało;) –

3

"Demon" ma bardziej szczegółową definicję niż "proces w tle". Domyślnie Popen wykona podproces i przekaże sterowanie Twojemu programowi, aby kontynuować działanie. Jednak nic nie mówi o zajmowaniu się sygnałami (w szczególności SIGHUP, jeśli użytkownik opuszcza powłokę przed zakończeniem procesu w tle) lub odłączeniem od stdin, stderr, stdout i wszelkich innych deskryptorów plików otwartych w momencie wywołania Popen. Jeśli naprawdę masz na myśli, że chcesz demona, powinieneś użyć modułu python-daemon, implementacji PEP 3143. Dba o części brutto, o których nie chcesz myśleć.