Команда Python popen. Подождите, пока команда не будет завершена


У меня есть скрипт, где я запускаю с popen команду оболочки. Проблема в том, что сценарий не ждет, пока эта команда popen не будет завершена, и go сразу же продолжится.

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

Как я могу сказать моему скрипту Python подождать, пока команда оболочки не закончится?

4 57

4 ответа:

в зависимости от того, как вы хотите работать ваш скрипт у вас есть два варианта. Если вы хотите, чтобы команды блокировались и ничего не делали во время выполнения, вы можете просто использовать subprocess.call.

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

если вы хотите делать что-то во время выполнения или кормить вещи в stdin, вы можете использовать communicate после 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

как указано в документации,wait может тупик, так что общаться желательно.

можно использовать subprocess для достижения этой цели.

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

то, что вы ищете-это wait метод.

пусть команда, которую вы пытаетесь передать, будет

os.system('x')

тогда вы скрываете его в заявлении

t = os.system('x')

Теперь python будет ждать вывода из командной строки, чтобы его можно было назначить переменной t.