打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python中使用subprocess库的Popen进行更灵活的进程控制
对比subprocess.call启动进程,使用subprocess.Popen能提供细粒度控制。
启动一个子进程:
process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
Popen的签名和和call函数类似;然而,Popen将会立即返回,而不像call那样等待子进程完成后返回。
等待子进程完成:
process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
process.wait()
从子进程中读取输出
process = subprocess.Popen([r'C:\path\to\app.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 这将阻塞进程直到完成
stdout, stderr = process.communicate()
print stdout
print stderr
在子进程执行过程中进行交互
你甚至可以在进程未完成的时对stdin和stdout进行读写操作。这个功能在其他程序自动化操作的场景中很有用。
对子线程的写操作

process = subprocess.Popen([r'C:\path\to\app.exe'], stdout = subprocess.PIPE, stdin =
subprocess.PIPE)
process.stdin.write('line of input\n') 
line = process.stdout.readline() 

然而,如果你你仅仅需要的是一组输入和输出,而不是动态交互,你应该使用communicate()而不是直接访问stdin和stdout。

从子进程中读取流
当你想逐行读取子线程的输出时,你可以使用下面的代码片段:
process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None:
 output_line = process.stdout.readline()

当自命令的输出不包含EOL字符的情况下,上面的片段将不会如逾期一样工作。在这种情况下,你可以从输出中按照字符诸葛读取,如下:
process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None: 
  output_line = process.stdout.read(1)
1作为读取方法的参数,使读取操作每次读取一个字符。你可以读取任意长度的字符。负数或者0则使read方法一直读取,直到遇到EOF。在上面的这些代码片段中,在子线程未完成之前process.poll()的值是None。这在没有更多输出需要读取时判断是否需要退出循环很有用。同样也适用于子进程的错误输出。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
python学习 subprocess模块
Python模块学习
Python获取CMD命令行输出结果
Python标准库06 子进程 (subprocess包)
python中执行命令的3种方法小结
python子进程模块subprocess详解与应用实例 之一
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服