Python popen 命令。等待命令完成

问题描述 投票:0回答:8

我有一个脚本,可以使用 popen shell 命令启动。 问题是脚本不会等到 popen 命令完成并立即继续。

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

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

python subprocess wait popen
8个回答
138
投票

根据您想要如何运行脚本,您有两种选择。如果您希望命令在执行时阻塞并且不执行任何操作,您可以使用

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


45
投票

您可以使用

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

24
投票

强制

popen
不继续,直到通过执行以下操作读取所有输出:

os.popen(command).read()

15
投票

让您尝试传递的命令为

os.system('x')

然后你将其隐藏为一个声明

t = os.system('x')

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

t


7
投票

您正在寻找的是

wait
方法。


7
投票

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
投票

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


0
投票

有两种不同的主要方式:

  1. 使用需要打开新控制台的间接命令,例如:
    subprocess.Popen("start /wait <your command>", stdout=subprocess.PIPE, shell=True)

(请参阅:https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/start

  1. 使用 python 打开一个新控制台,其中包含以下内容,例如:
    subprocess.Popen("<your command>", creationflags=subprocess.CREATE_NEW_CONSOLE)

(参见:https://docs.python.org/3/library/subprocess.html

© www.soinside.com 2019 - 2024. All rights reserved.