Python subprocess模块进阶:从基础调用到进程间通信

晚来风
晚来风
发布时间:2026-10-13 | 5人浏览过
原创

本文深入解析Python标准库subprocess模块,旨在替代旧的os.system等方法。详细讲解call()执行命令、check_output()获取结果以及Popen类进行复杂进程交互的使用方法。通过代码示例展示如何控制子进程等待、重定向标准输出及利用管道实现进程间文本通信,帮助开发者高效管理外部程序。

介绍

引入subprocess模块的核心目的在于替代os.system等较为陈旧且功能受限的模块与方法。

在Python环境中运行脚本时,系统实际上是在创建并运行一个独立的进程。类似于Linux操作系统中的机制,一个父进程可以fork(派生)出一个子进程,并让该子进程exec(执行)另一个外部程序。在Python中,我们可以借助标准库提供的subprocess包来fork子进程,进而运行外部程序。

subprocess包内定义了多个用于创建子进程的函数,它们以不同的策略创建子进程,因此用户可以根据具体需求选择最合适的函数。此外,subprocess还提供了管理标准流(standard stream)和管道(pipe)的工具,使得进程间能够通过文本进行通信。

导入模块

>>> import subprocess

命令执行call()

该函数用于执行由参数提供的命令,并将数组作为参数传入以运行命令。其功能与os.system(cmd)类似。

>>> subprocess.call(['ls','-l')

其中,参数shell的默认值为False。

当将shell参数设置为True时,可以直接传递字符串形式的命令:

>>> subprocess.call('ls -l',shell=True)

获得返回结果check_output()

由于call()函数不返回命令执行的显示结果,若需获取输出内容,可以使用check_output()函数:

>>> result = subprocess.check_output(['ls','-l'],shell=True)
>>> result.decode('utf-8')

进程创建和管理Popen类

subprocess.Popen类用于替代os.popen。通过创建Popen类的实例,可以创建子进程并进行复杂的交互操作。

创建不等待的子进程

import subprocess

child = subprocess.Popen(['ping','-c','4','www.baidu.com'])
print('Finished')

添加子进程等待机制

import subprocess

child = subprocess.Popen(['ping','-c','4','www.baidu.com'])
child.wait() # 等待子进程结束
print('Finished')

调用wait()方法后,主进程会阻塞并等待子进程执行完毕,随后再继续执行后续语句。

子进程文本流控制

标准输出重定向示例:

import subprocess

child = subprocess.Popen(['ls','-l'],stdout=subprocess.PIPE)    #将标准输出定向输出到subprocess.PIPE
print(child.stdout.read()) 

结合stdin使用示例:

import subprocess

child1 = subprocess.Popen(['cat','/etc/passwd'],stdout=subprocess.PIPE)
child2 = subprocess.Popen(['grep','root'],stdin=child1.stdout,stdout=subprocess.PIPE)

print child2.communicate()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表