6个例子快速学会python中subprocess库的使用

本文详细介绍了Python的subprocess模块,用于在Python程序中执行外部命令。通过示例展示了如何运行Python脚本、获取返回值、捕获标准输出和错误,以及处理子进程中的错误。此外,还演示了如何通过input参数与子进程进行通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

subprocess

官方中文文档

介绍参考文档,我的直观感受和实际用法是:subprocess可以开启一个子进程来运行cmd命令。那就意味着可以在一个py文件里运行另一个py文件

例1:快速使用subprocess

新建一个目录,目录下有两个文件

|-demo
    |-main.py
    |-hello.py

hello.py

# hello.py
print('hello world!')

main.py

import subprocess

subprocess.run(['python', 'hello.py'])

执行main.py文件得到如下结果

hello world!

例2:subprocess.run()的返回值

修改代码如下:

# main.py
import subprocess

res = subprocess.run(['python', 'hello.py'])
print("args:", res.args)
print("returncode", res.returncode)

运行后

hello world!
args: ['python', 'hello.py']
returncode: 0

returncode 表示你run的这个py文件过程是否正确,如果正确,返回0,否则返回1

例3:全面的返回值介绍

  • args:被用作启动进程的参数,可能是列表或字符串
  • returncode:子进程的退出状态码
  • stdout:从子进程捕获到的标准输出,但是没设置subprocess.run()中的stdout参数时,这一项是None
  • stderr:捕获到的子进程标准错误,没设置subprocess.run()中的stderr参数时,这一项是None
  • check_returncode():如果 returncode 非零, 抛出 CalledProcessError.

修改main.py

# main.py
import subprocess

res = subprocess.run(['python', 'hello.py'])
print("args:", res.args)
print("returncode", res.returncode)
print("stdout", res.stdout)
print("stderr", res.stderr)

结果:

hello world!
args: ['python', 'hello.py']
returncode 0
stdout None
stderr None

Process finished with exit code 0

可以看到,没有设置subprocess.run()中的参数stdoutstderr时,这两项都是None

例4:代码有bug的情况

新建fail.py,故意制造一个bug

# fail.py
a = 

修改main.py

# main.py
import subprocess

res = subprocess.run(['python', 'hello.py'])
res2 = subprocess.run(['python', 'fail.py'])

再运行main函数,得到返回

hello world!
  File "fail.py", line 2
    a =
      ^
SyntaxError: invalid syntax

可以看到,先是正确打印了hello.py的内容,然后是fail.py的错误信息。

例5:捕获stdout和stderr

修改main.py

# main.py
import subprocess

res = subprocess.run(['python', 'hello.py'], stdout=subprocess.PIPE)
res2 = subprocess.run(['python', 'fail.py'], stderr=subprocess.PIPE)

print('hello.py stdout:', res.stdout)
print('fail.py stderr:', res2.stderr)

结果

hello.py stdout: b'hello world!\r\n'
fail.py stderr: b'  File "fail.py", line 2\r\n    a =\r\n      ^\r\nSyntaxError: invalid syntax\r\n'

可以通过res.stdoutres2.stderr分别拿到正确print的信息和错误信息。

同时可以发现,子进程print和报错内容就不会在父进程打印输出了。

注意这里的res.stdout是一串二进制字符串。如果设置encoding参数,拿到的就是字符串。

res = subprocess.run(['python', 'hello.py'], 
                     stdout=subprocess.PIPE,
                     encoding='utf8')

例6:与子进程进行通信

可以通过subprocess.run()input参数给子进程发送消息。如果不设置encoding,就要传入二进制串,比如b'hello input'

# main.py
import subprocess
from subprocess import PIPE

res = subprocess.run(['python', 'hello.py'],
                     input='hello input',
                     encoding='utf8')

修改hello.py接收传进来的字符串。

# hello.py 
import sys
data = sys.stdin.read()
print(data)

结果

hello input

Process finished with exit code 0
Python的os和sys模块是其标准中的核心组成部分,它们分别提供了与操作系统交互的功能和访问与Python解释器紧密相关的变量和函数的能力。为了帮助你学习如何使用这些模块创建一个文本编辑器插件,建议参阅《Python经典练习题合集(含分析+代码)》这本书,它将为你提供基础知识与实践相结合的材料,直接关联到你的问题。 参考资源链接:[Python经典练习题合集(含分析+代码)](https://wenku.csdn.net/doc/5870fznh26?spm=1055.2569.3001.10343) 下面是一个创建简单文本编辑器插件的过程和示例代码:(步骤、代码、mermaid流程图、扩展内容,此处略) 在这个例子中,我们首先导入了os模块和sys模块,然后定义了一个简单的文本编辑器功能,允许用户输入文本,并保存到指定的文件中。我们使用sys.argv来获取命令行参数,这样用户就可以指定保存文件的路径。使用os模块,我们检查文件路径是否存在以及是否可写,并在必要时创建它。最后,我们将用户输入的文本写入文件。 学会了如何使用os和sys模块进行文件处理和命令行参数解析后,如果你想要进一步提高你的编程技能,可以继续深入学习Python的其他标准模块,如shutil、subprocess等,它们在文件操作和进程管理方面提供了更多的功能和灵活性。而《Python经典练习题合集(含分析+代码)》这本书不仅包含了本问题的解决方案,还涵盖了Python编程的其他重要知识点,是深化学习Python的好资源。 参考资源链接:[Python经典练习题合集(含分析+代码)](https://wenku.csdn.net/doc/5870fznh26?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值