2009-10-22 12 views
10

J'ai essayé ces deux méthodes:Comment lancer et exécuter un script externe en arrière-plan?

os.system("python test.py") 

subprocess.Popen("python test.py", shell=True) 

Les deux approches doivent attendre test.py fin du processus principal qui bloque. Je sais que "nohup" peut faire le travail. Existe-t-il un moyen Python de lancer test.py ou tout autre script shell et de le laisser fonctionner en arrière-plan?

test.py Supposer comme ceci:

for i in range(0, 1000000): 
    print i 

deux os.system() ou subprocess.Popen() bloquera programme principal jusqu'à ce que 1000000 lignes de sortie affichées. Ce que je veux c'est laisser tester.py s'exécuter en silence et afficher la sortie du programme principal uniquement. Le programme principal peut s'arrêter pendant que test.py est toujours en cours d'exécution.

Répondre

32

subprocess.Popen(["python", "test.py"])should work. Notez que le travail peut encore mourir lorsque votre script principal se termine. Dans ce cas, essayez subprocess.Popen(["nohup", "python", "test.py"])

+1

subprocess.Popen ([ "python", "test.py"]) lance simplement test.py et blocs processus principal en attendant la sortie de test.py. – jack

+2

Cela ne devrait se produire que si vous demandez 'stdout = PIPE'. Quelle version de Python? Pouvez-vous ajouter un 'print 'xxx" 'après l'appel à Popen pour vérifier qu'il bloque vraiment? –

+0

Je viens de tester le code ci-dessus et cela fonctionne pour moi avec Python 2.5.2 sous Windows. Votre problème doit être autre chose. –

1
os.spawnlp(os.P_NOWAIT, "path_to_test.py", "test.py") 
+0

cela fonctionne, mais est-il possible de laisser test.py s'exécute en mode silencieux? – jack

+0

en silence? voulez-vous dire que vous ne voulez pas voir la sortie à l'écran? – Viswanadh

+0

oui, je ne veux pas voir la sortie à l'écran. Puis-je être fait en ajoutant ">>/dev/null" au code? – jack