我有一个脚本,可通过popen shell命令启动。问题在于脚本不会等到该popen命令完成后才继续运行。
om_points = os.popen(command, "w")
.....
如何告诉我的Python脚本等待shell命令完成?
Answers:
根据您想如何使用脚本,您有两种选择。如果您希望命令阻塞并且在执行时不执行任何操作,则可以使用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.run()
是在Python 3.5中添加的,并且是“建议的调用子流程的方法”
您可以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
让您尝试传递的命令为
os.system('x')
然后你把它隐瞒了
t = os.system('x')
现在python将等待命令行的输出,以便将它分配给变量t
。
您正在寻找的是wait
方法。
wait
是subprocess
该类的一种方法。
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()将适合具有较小尺寸的输出。对于较大的输出,这不是最佳方法。