分享

Python中使用subprocess库的Popen进行更灵活的进程控制

 启辰ozkb3yjim4 2018-09-30
对比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。这在没有更多输出需要读取时判断是否需要退出循环很有用。同样也适用于子进程的错误输出。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多