2010-09-30 9 views
5

J'essaye d'utiliser Python (via le framework Django) pour faire un appel de ligne de commande Linux et j'ai essayé os.system et os.open mais pour ces deux, il semble que le script Python se bloque après avoir fait l'appel en ligne de commande l'appel est pour l'instanciation d'un serveur (ainsi il ne finit jamais car il devait être long). Je sais que pour faire quelque chose comme ça avec d'autres codes Python, vous pouvez utiliser quelque chose comme le céleri mais je me suis dit qu'il y aurait un moyen simple de faire un appel en ligne de commande et de ne pas être lié passé, je me demande si je fais quelque chose de mal ... merci pour tout conseil.Python, utilisant os.system - Y a-t-il un moyen pour que le script Python dépasse cette attente sans attendre que l'appel se termine?

Je fais l'appel comme celui-ci actuellement

os.system("command_to_start_server") 

aussi essayé:

response = os.popen("command_to_start_server") 

Répondre

9

Je ne suis pas sûr, mais je pense the subprocess module avec son Popen est beaucoup plus flexible que os.popen. Si je me souviens bien, cela inclut le processus de génération asynchrone, ce que je pense être ce que vous cherchez.

Edit: Il a été un moment que je le module subprocess, mais si je ne me trompe pas, subprocess.Popen retourne immédiatement, et seulement lorsque vous essayez de communiquer avec le processus (comme la lecture de sa sortie) using subprocess.communicate votre bloc de programme attend la sortie s'il n'y en a pas.

+0

merci, cela ressemble à une meilleure solution que ce que je faisais ... il y a un peu étrange " liaison "type de comportement qui se passe quand je fais appels de ligne cmd comme je l'étais à travers un objet initié à partir de Django, l'appel que je faisais sur la ligne cmd était de démarrer un autre serveur de test (sur port diff) mais en quelque sorte lié au serveur de test Django où il fait échouer le serveur de test Django bien que je puisse normalement les exécuter tous les deux en même temps quand je les lance manuellement à partir de la ligne cmd – Rick

0

Essayez:

os.system("command_to_start_server &>/dev/null &") 
+0

Merci, ça a fonctionné bien qu'il donne toujours un comportement étrange comme la page de sortie dans Django (même si sa sortie finale) continue à afficher "Chargement" indéfiniment ... mais faire ce que vous avez dit l'a fait passer la partie où il était "suspendu" – Rick

+0

maintenant il redirige toute la sortie vers/dev/null, donc rien ne sera montré sur la page – tamasd