Python popen команда. Подождите, пока команда не закончится - PullRequest
61 голосов
/ 15 мая 2010

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

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

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

Ответы [ 5 ]

89 голосов
/ 15 мая 2010

В зависимости от того, как вы хотите работать со своим сценарием, у вас есть два варианта. Если вы хотите, чтобы команды блокировались и ничего не делали во время выполнения, вы можете просто использовать 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 может зайти в тупик, поэтому рекомендуется общаться.

14 голосов
/ 15 августа 2016

Вы можете использовать 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
5 голосов
/ 15 мая 2010

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

1 голос
/ 16 ноября 2018

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")
0 голосов
/ 13 апреля 2018

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

os.system('x')

тогда вы преобразуете его в утверждение

t = os.system('x')

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

...