98

我有一个脚本,我在其中启动了一个 shell 命令。问题是脚本不会等到 popen 命令完成并立即继续执行。

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

如何告诉我的 Python 脚本等到 shell 命令完成?

4

7 回答 7

122

根据您希望如何处理脚本,您有两种选择。如果您希望命令在执行时阻止而不做任何事情,您可以使用subprocess.call.

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

如果你想在它执行的时候做一些事情或者把事情输入stdin,你可以communicatepopen调用之后使用。

#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可能会死锁,因此建议进行交流。

于 2010-05-14T20:15:36.320 回答
36

你可以用你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
于 2016-08-15T14:09:16.537 回答
20

通过执行以下操作强制popen在读取所有输出之前不继续:

os.popen(command).read()
于 2019-11-20T17:37:03.780 回答
11

让您尝试传递的命令成为

os.system('x')

然后您将其转换为声明

t = os.system('x')

现在 python 将等待命令行的输出,以便将其分配给变量t

于 2018-04-13T14:23:12.663 回答
5

您正在寻找的是wait方法。

于 2010-05-14T20:07:06.610 回答
4

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")
于 2018-11-15T21:10:55.343 回答
0

我认为 process.communicate() 适合小尺寸的输出。对于更大的输出,这不是最好的方法。

于 2020-11-04T07:28:15.000 回答