Python中的subprocess模块允许我们在Python中创建新的进程,与外部进程进行交互并获取执行结果。其中,Popen()是最基本的函数之一,它可以启动一个子进程,并返回一个Popen对象,该对象可用于操作子进程。
下面是获取Popen输出、等待进程完成的一般步骤:
-
导入subprocess模块
import subprocess
-
使用Popen启动子进程,以获取执行命令的输出
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
在此示例中,我们使用了stdout=subprocess.PIPE
将标准输出(stdout
)捕获到管道中,也可以使用stderr=subprocess.PIPE
捕获标准错误(stderr
)到管道中。shell=True
表示在shell下运行命令。 -
循环读取输出,直到进程完成
while process.poll() is None:
output = process.stdout.readline().rstrip().decode()
if output:
print(output)
在此示例中,我们使用了poll()
来检查子进程是否完成。我们将循环读取由管道传输的所有输出,直到子进程完成输出后返回None
。 -
调用wait()等待进程完成
process.wait()
在此示例中,我们使用wait()
来阻塞当前进程,等待子进程完成。
下面是获取Popen输出、等待进程完成的两个示例说明:
示例1:执行简单的shell命令
在此示例中,我们使用Popen执行ls命令,并捕获标准输出,等待该进程完成并输出结果。
import subprocess
command = 'ls /'
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
while process.poll() is None:
output = process.stdout.readline().rstrip().decode()
if output:
print(output)
process.wait()
其中,ls /
是Linux/Mac下的命令,用于列出根目录下的所有文件和文件夹。在Windows下可以使用dir C:\
代替。
示例2:执行Python脚本并获取输出
在此示例中,我们使用Popen执行一个Python脚本,并捕获标准输出,等待该进程完成并输出结果。
Python脚本示例(content.py)如下:
name = input("Please enter your name: ")
print("Hello, " + name + "!")
Python程序示例:
import subprocess
with open('output.log', 'w') as o:
command = ['python', 'content.py']
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while process.poll() is None:
output = process.stdout.readline().decode()
if output:
o.write(output)
print(output)
process.wait()
在此示例中,我们使用了with open()
来打开一个文件o,将程序运行输出保存在该文件中。
在命令行下执行python program.py
后,程序将等待用户输入姓名,并输出信息“Hello, ____!”。在本例中,我们使用Popen执行程序,并从标准输出中获取输出结果,并将其输出到文件output.log和控制台。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python Popen 获取输出,等待运行完成示例 - Python技术站