web-dev-qa-db-fra.com

Python popen commande. Attendez que la commande soit terminée

J'ai un script dans lequel je lance avec popen une commande Shell . Le problème est que le script n'attend pas que la commande popen soit terminée et continue tout de suite.

om_points = os.popen(command, "w")
.....

Comment puis-je demander à mon script Python d'attendre la fin de la commande Shell?

60
michele

Selon la manière dont vous voulez utiliser votre script, vous avez deux options. Si vous voulez que les commandes bloquent et ne fassent rien pendant son exécution, vous pouvez simplement utiliser subprocess.call.

#start and block until done
subprocess.call([data["om_points"], ">", diz['d']+"/points.xml"])

Si vous souhaitez effectuer certaines tâches pendant son exécution ou insérer des éléments dans stdin, vous pouvez utiliser communicate après l'appel popen.

#start and process things, then wait
p = subprocess.Popen([data["om_points"], ">", diz['d']+"/points.xml"])
print "Happens while running"
p.communicate() #now wait plus that you can send commands to process

Comme indiqué dans la documentation, wait peut provoquer une impasse, il est donc conseillé de communiquer.

85
unholysampler

Vous pouvez utiliser subprocess pour y parvenir.

import subprocess

#This command could have multiple commands separated by a new line \n
some_command = "export PATH=$PATH://server.sample.mo/app/bin \n customupload abc.txt"

p = subprocess.Popen(some_command, stdout=subprocess.PIPE, Shell=True)

(output, err) = p.communicate()  

#This makes the wait possible
p_status = p.wait()

#This will give you the output of the command being executed
print "Command output: " + output
13
Touchstone

Ce que vous recherchez, c'est la méthode wait .

5
Olivier Verdier

wait () fonctionne bien pour moi. Les sous-processus p1, p2 et p3 sont exécutés de la même manière. Par conséquent, tous les processus sont terminés après 3 secondes. 

import subprocess

processes = []

p1 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, Shell=True)
p2 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, Shell=True)
p3 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, Shell=True)

processes.append(p1)
processes.append(p2)
processes.append(p3)

for p in processes:
    if p.wait() != 0:
        print("There was an error")

print("all processed finished")
1
Simon Bachmann

Laissez la commande que vous essayez de passer soit 

os.system('x')

alors vous le convertissez en une déclaration

t = os.system('x')

maintenant, le python attendra la sortie de la ligne de commande pour pouvoir l'affecter à la variable t.

0