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