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?
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.
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
Ce que vous recherchez, c'est la méthode wait
.
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")
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
.