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

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

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
  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: `subprocess`是Python的一个标准,用于在Python启动和管理外部进程。下面是一些常见的用法: 1. 运行外部命令并获取输出: ```python import subprocess result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE) print(result.stdout.decode()) ``` 这里的`run()`函数接收一个命令列表作为参数,运行该命令并等待其完成。`stdout=subprocess.PIPE`参数指定将命令输出返回到Python进程。`result.stdout.decode()`将字节字符串转换为文本输出。 2. 捕获标准错误输出: ```python import subprocess try: result = subprocess.run(['invalid-command'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) except subprocess.CalledProcessError as e: print(e.stderr.decode()) ``` 这里使用了`try/except`结构来捕获`CalledProcessError`异常,因为命令无效,所以会抛出这个异常。`e.stderr.decode()`将标准错误输出转换为文本输出。 3. 通过管道传递输入和输出: ```python import subprocess p1 = subprocess.Popen(['cat'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) p2 = subprocess.Popen(['grep', 'hello'], stdin=p1.stdout, stdout=subprocess.PIPE) result = p2.communicate(input=b'hello world\n')[0] print(result.decode()) ``` 这里的`Popen()`函数用于启动外部进程,并将其输入和输出重定向到Python进程。使用`Popen()`函数创建两个进程,并将第一个进程的输出作为第二个进程的输入。`p2.communicate()`函数将输入数据发送到第一个进程,并返回输出结果。 这些是`subprocess`的一些基本用法。更多详细信息,请查看Python官方文档。 ### 回答2: Python的`subprocess`是用于在Python脚本调用外部命令的模块。它提供了创建子进程、连接子进程的输入/输出/错误管道以及获取子进程返回值的功能。 要使用`subprocess`,首先需要导入该模块:`import subprocess` `subprocess`通过`Popen`类来创建子进程,然后可以使用其他方法与子进程进行交互。下面是一些常见的用法: 1. 运行命令: ```python subprocess.run(['ls', '-l']) # 运行命令 ls -l ``` 2. 获取命令输出: ```python result = subprocess.run(['ls', '-l'], capture_output=True, text=True) # 捕获命令输出并以文本形式返回 print(result.stdout) # 输出命令输出结果 print(result.returncode) # 输出命令的返回值 ``` 3. 运行命令并检查返回值: ```python try: subprocess.run(['git', 'commit', '-m', 'message'], check=True) # 运行 git commit 命令,并检查返回值是否为0 except subprocess.CalledProcessError as e: print(f"Command execution failed: {e.returncode}") # 如果返回值不为0,输出错误信息 ``` 4. 管道连接多个子进程: ```python process1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE) process2 = subprocess.Popen(['grep', 'file.txt'], stdin=process1.stdout, stdout=subprocess.PIPE) output = process2.communicate()[0] # 获取命令输出 ``` 除了上述示例之外,`subprocess`还提供了其他许多方法和参数,用于处理更复杂的子进程交互场景。需要根据具体的需求,参考Python文档或相关资料来更深入了解和使用`subprocess`。 ### 回答3: Pythonsubprocess是用来创建子进程并与其进行通信的模块。下面将简单介绍subprocess的基本用法。 1. 导入subprocess: ``` import subprocess ``` 2. 运行命令并获取输出: 可以使用`subprocess.run()`函数来运行命令,并通过`stdout`参数获取输出。例如,运行`ls`命令并获取输出: ``` result = subprocess.run(['ls'], stdout=subprocess.PIPE) output = result.stdout.decode('utf-8') print(output) ``` 3. 运行命令并获取返回值: 可以使用`subprocess.run()`函数来运行命令,并通过`returncode`属性获取命令的返回值。例如,运行`ls`命令并获取返回值: ``` result = subprocess.run(['ls']) return_code = result.returncode print(return_code) ``` 4. 使用管道连接多个命令: 可以使用`|`符号来连接多个命令,并通过`shell=True`参数使其生效。例如,运行`ls | grep py`命令并获取输出: ``` result = subprocess.run('ls | grep py', shell=True, stdout=subprocess.PIPE) output = result.stdout.decode('utf-8') print(output) ``` 5. 运行外部脚本文件: 可以使用`subprocess.run()`函数来运行外部的Python脚本文件。例如,运行名为`script.py`的外部脚本文件: ``` result = subprocess.run(['python', 'script.py']) ``` 这些是subprocess的基本用法,还有更多高级的用法可以根据具体需求进一步探索和学习。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值