Python popen команда. Подождите, пока команда не закончится
У меня есть скрипт, который я запускаю с помощью команды popen shell. Проблема в том, что скрипт не ждет, пока эта команда popen завершится, и go сразу же продолжится.
om_points = os.popen(command, "w")
.....
Как я могу сказать своему скрипту Python подождать, пока не завершится команда оболочки?
5 ответов
В зависимости от того, как вы хотите работать со своим сценарием, у вас есть два варианта. Если вы хотите, чтобы команды блокировались и ничего не делали во время выполнения, вы можете просто использовать 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
Сила popen
чтобы не продолжать, пока весь вывод не будет прочитан, выполнив:
os.popen(command).read()
Пусть команда, которую вы пытаетесь передать, будет
os.system('x')
тогда вы скрываете это к заявлению
t = os.system('x')
теперь питон будет ожидать вывода из командной строки, чтобы его можно было присвоить переменной t
,
У меня нормально работает wait() Подпроцессы p1, p2 и p3 выполняются одновременно. Поэтому все процессы выполняются через 3 секунды.
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")
Я думаю, что process.communicate() подойдет для вывода небольшого размера. Для большей производительности это не лучший подход.