Python subprocess模块原理与实战:从进程创建到输出处理

Leo
Leo
发布时间:2026-10-14 | 5人浏览过
原创

本文深入解析Python中subprocess模块的核心原理,指出其本质是通过shell或命令行启动外部程序而非直接调用Python函数。通过具体代码示例,演示了如何利用subprocess.run和Popen进行进程创建、参数传递,并详细讲解了处理二进制输出、解码字符串以及将标准输出重定向至文件的方法,帮助开发者掌握跨语言进程调用的关键技术。

Python的subprocess模块用于创建和管理子进程,这看似简单,但其工作机制与许多开发者的直观认知存在差异。

subprocess模块原理与基础用法

一、深入理解subprocess的本质

常见的误解是认为subprocess可以直接在Python内部调用某个函数(若仅需此功能,建议使用multiprocessing模块)。

实际上,subprocess的核心机制是通过Shell或命令行接口启动一个新的外部程序进程。这意味着它可以执行任何可执行文件,例如使用“ls”命令列出当前目录文件,这显然是一个Shell通用指令,而非Python内置函数。

基础示例:

# 启动子进程执行“ls”命令,并输出当前目录下的文件列表 import subprocess p = subprocess.run(["ls"])

通过子进程调用Python函数的实现

二、subprocess的实际应用场景

当我们需要通过subprocess来间接执行Python函数时,通常需要采用迂回的策略,即启动一个新的Python解释器进程。

具体实现步骤如下:

(1)首先,创建一个包含待执行逻辑的脚本文件test_print.py。


import sys
def print_it(a, b , c):
  print(a)
  print(b)
  print(c)
if __name__ == "__main__":
  print_it(sys.argv[1], sys.argv[2], sys.argv[3])

(2)接着,编写主脚本,通过传递命令行参数的形式来调用test_print.py。


import subprocess


p = subprocess.run(["python", "test_print.py", "a1", "b2", "c3"])
pp = subprocess.run(["python", "test_print.py", "d4", "e5", "f6"])

(3)执行后,控制台将显示如下结果:

a1

b2

c3

d4

e5

f6

输出重定向与二进制数据处理

三、常见用法与输出处理技巧

1. 处理标准输出重定向:

(1)同样需要预先创建好包含逻辑的脚本test_print.py。


import sys
def print_it(a, b , c):
  print(a)
  print(b)
  print(c)
if __name__ == "__main__":
  print_it(sys.argv[1], sys.argv[2], sys.argv[3])

(2)主脚本通过参数传递方式调用该脚本。


import subprocess

p = subprocess.Popen(["python", "test_print.py", "a1", "b2", "c3"], stdout=subprocess.PIPE, shell=True) #shell=True 为必须,否则stdout无法读出
pp = subprocess.Popen(["python", "test_print.py", "d4", "e5", "f6"], stdout=subprocess.PIPE, shell=True) 

print(p.stdout.read()) 
print(pp.stdout.read())

此时,若直接读取输出,得到的将是二进制数据而非字符串。

b'a1\r\nb2\r\nc3\r\n' b'd4\r\ne5\r\nf6\r\n'

为了获得可读的文本结果,必须对二进制数据进行解码处理(尽管不处理程序也能运行,但结果不易阅读)。


import subprocess
p = subprocess.Popen(["python", "test_print.py", "a1", "b2", "c3"], stdout=subprocess.PIPE, shell=True) #shell=True 为必须,否则stdout无法读出
pp = subprocess.Popen(["python", "test_print.py", "d4", "e5", "f6"], stdout=subprocess.PIPE, shell=True) 
# 用str转化一下就好。
print(str(p.stdout.read(), encoding = "utf8"))
print(str(pp.stdout.read(), encoding = "utf8"))

(3)将输出重定向至外部文件:


import subprocess
# 注意,此步骤为必须
f_handler=open('out.log', 'w')
p = subprocess.run(["python", "test_print.py", "a1", "b2", "c3"], stdout=f_handler)
pp = subprocess.run(["python", "test_print.py", "d4", "e5", "f6"], stdout=f_handler)# 一个错误用法
p_error = subprocess.run(["python", "test_print.py", "d4", "e5", "f6"], stdout='out.log') # 这样是不行的

执行后,屏幕将不再显示任何输出,因为所有结果已被写入到out.log文件中。

以上即为Python subprocess模块的核心原理与常用操作指南,希望能为您的开发工作提供有益参考。

本站声明

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

Python 相关产品和应用

全部下载

专题列表