掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

Python中subprocess模块详解(常用函数、参数介绍、作用、用法)

在 Python 编程中,subprocess 模块是一个非常强大的工具,用于生成新的进程、连接到它们的输入/输出/错误管道,并获取它们的返回码。通过 subprocess 模块,Python 程序可以调用外部命令和程序,从而实现更复杂的功能。本文将详细介绍 subprocess 模块中的常用函数、参数及其作用和用法,帮助读者更好地理解和使用这一模块。

一、subprocess 模块概述

  1. 什么是 subprocess 模块

subprocess 模块是 Python 标准库的一部分,提供了创建和管理子进程的能力。

它允许你在 Python 程序中调用外部命令,并与这些命令进行交互,如读取标准输出、写入标准输入等。

subprocess 模块取代了旧的 os.system、os.spawn* 和 os.popen* 等方法,提供了更强大和灵活的功能。

  1. 主要功能

创建和管理子进程。

获取子进程的标准输出、标准错误和返回码。

向子进程发送信号。

实现复杂的进程间通信。

二、常用函数及参数介绍

1)subprocess.run()

  1. 作用:运行一个命令并等待其完成。

  2. 参数:

args:要执行的命令及其参数,可以是字符串或列表。

stdin:指定子进程的标准输入。

stdout:指定子进程的标准输出。

stderr:指定子进程的标准错误。

capture_output:如果设置为 True,则捕获标准输出和标准错误。

text:如果设置为 True,则以文本模式处理输入和输出;默认为 False,即二进制模式。

check:如果设置为 True,当子进程返回非零退出码时,会抛出 CalledProcessError 异常。

timeout:超时时间(秒),超过该时间后会抛出 TimeoutExpired 异常。

  1. 示例代码:

import subprocess
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print("Return code:", result.returncode)
print("Output:\n", result.stdout)
print("Error:\n", result.stderr)

2)subprocess.Popen()

  1. 作用:启动一个新的进程,并提供更多的控制选项。

  2. 参数:

args:要执行的命令及其参数,可以是字符串或列表。

stdin:指定子进程的标准输入。

stdout:指定子进程的标准输出。

stderr:指定子进程的标准错误。

cwd:指定子进程的工作目录。

env:指定子进程的环境变量。

universal_newlines:如果设置为 True,则以文本模式处理输入和输出;默认为 False,即二进制模式。

  1. 示例代码:

import subprocess
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
print("Return code:", process.returncode)
print("Output:\n", stdout.decode())
print("Error:\n", stderr.decode())

3)subprocess.check_call()

  1. 作用:运行一个命令,并检查其返回码。如果返回码非零,则抛出 CalledProcessError 异常。

  2. 参数:

args:要执行的命令及其参数,可以是字符串或列表。

stdin:指定子进程的标准输入。

stdout:指定子进程的标准输出。

stderr:指定子进程的标准错误。

timeout:超时时间(秒),超过该时间后会抛出 TimeoutExpired 异常。

  1. 示例代码:

import subprocess
try:
    subprocess.check_call(['ls', '-l'])
except subprocess.CalledProcessError as e:
    print(f"Command failed with return code {e.returncode}")

4)subprocess.check_output()

  1. 作用:运行一个命令,并捕获其标准输出。如果返回码非零,则抛出 CalledProcessError 异常。

  2. 参数:

args:要执行的命令及其参数,可以是字符串或列表。

stdin:指定子进程的标准输入。

stderr:指定子进程的标准错误。

timeout:超时时间(秒),超过该时间后会抛出 TimeoutExpired 异常。

  1. 示例代码:

import subprocess
try:
    output = subprocess.check_output(['ls', '-l'])
    print("Output:\n", output.decode())
except subprocess.CalledProcessError as e:
    print(f"Command failed with return code {e.returncode}")

5)subprocess.call()

  1. 作用:运行一个命令,并返回其返回码。

  2. 参数:

args:要执行的命令及其参数,可以是字符串或列表。

stdin:指定子进程的标准输入。

stdout:指定子进程的标准输出。

stderr:指定子进程的标准错误。

timeout:超时时间(秒),超过该时间后会抛出 TimeoutExpired 异常。

  1. 示例代码:

import subprocess
return_code = subprocess.call(['ls', '-l'])
print("Return code:", return_code)

三、常见用法示例

  1. 运行简单的命令

示例代码:

import subprocess
result = subprocess.run(['echo', 'Hello, World!'], capture_output=True, text=True)
print("Output:", result.stdout)
  1. 捕获标准输出和标准错误

示例代码:

import subprocess
result = subprocess.run(['ls', 'nonexistent_directory'], capture_output=True, text=True)
print("Output:", result.stdout)
print("Error:", result.stderr)
  1. 传递环境变量

示例代码:

import subprocess
import os
env = os.environ.copy()
env['MY_VAR'] = 'my_value'
result = subprocess.run(['echo', '$MY_VAR'], env=env, shell=True, capture_output=True, text=True)
print("Output:", result.stdout)
  1. 设置工作目录

示例代码:

import subprocess
result = subprocess.run(['pwd'], cwd='/tmp', capture_output=True, text=True)
print("Output:", result.stdout)
  1. 超时处理

示例代码:

import subprocess
try:
    result = subprocess.run(['sleep', '5'], timeout=3, capture_output=True, text=True)
    print("Output:", result.stdout)
except subprocess.TimeoutExpired as e:
    print("Command timed out")
  1. 向子进程发送信号

示例代码:

import subprocess
import signal
import time
process = subprocess.Popen(['sleep', '10'])
time.sleep(3)  # 让子进程运行一段时间
process.send_signal(signal.SIGTERM)  # 发送终止信号
process.wait()  # 等待子进程结束
print("Return code:", process.returncode)
  1. 多线程或多进程处理

示例代码:

import subprocess
import concurrent.futures
def run_command(command):
    result = subprocess.run(command, capture_output=True, text=True)
    return result.stdout
commands = [['ls', '-l'], ['echo', 'Hello, World!'], ['pwd']]
with concurrent.futures.ThreadPoolExecutor() as executor:
    results = list(executor.map(run_command, commands))
for result in results:
    print(result)

四、注意事项和最佳实践

  1. 安全问题

使用 shell=True 时要特别小心,因为它可能会导致命令注入攻击。尽量使用列表形式传递命令和参数。

示例代码:

import subprocess
# 不安全的方式
command = "rm -rf /"
subprocess.run(command, shell=True)
# 安全的方式
subprocess.run(['rm', '-rf', '/'])
  1. 处理编码问题

在处理文本数据时,确保正确设置编码,避免乱码问题。

示例代码:

import subprocess
result = subprocess.run(['echo', '你好,世界!'], capture_output=True, text=True, encoding='utf-8')
print("Output:", result.stdout)
  1. 异常处理

在调用 subprocess 函数时,务必处理可能出现的异常,如 CalledProcessError 和 TimeoutExpired。

示例代码:

import subprocess
try:
    result = subprocess.run(['ls', 'nonexistent_directory'], check=True, capture_output=True, text=True)
    print("Output:", result.stdout)
except subprocess.CalledProcessError as e:
    print(f"Command failed with return code {e.returncode}")
    print("Error:", e.stderr)
  1. 资源管理

确保在不需要子进程时及时关闭它,释放系统资源。

示例代码:

import subprocess
process = subprocess.Popen(['sleep', '10'])
process.terminate()  # 终止子进程
process.wait()  # 等待子进程结束
  1. 日志记录

在生产环境中,建议记录子进程的输出和错误信息,以便于调试和监控。

示例代码:

import subprocess
import logging
logging.basicConfig(level=logging.DEBUG)
result = subprocess.run(['ls', 'nonexistent_directory'], capture_output=True, text=True)
logging.debug("Output: %s", result.stdout)
logging.error("Error: %s", result.stderr)

Python中subprocess模块详解(常用函数、参数介绍、作用、用法)

subprocess 模块是 Python 中非常强大且灵活的工具,用于管理和控制子进程。本文详细介绍了 subprocess 模块中的常用函数、参数及其作用和用法,并提供了多个示例代码来帮助读者更好地理解和应用这些知识。通过合理使用 subprocess 模块,可以显著提高 Python 程序的功能性和灵活性。希望本文能够帮助读者掌握 subprocess 模块的使用技巧,并在实际项目中发挥其最大效能。

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

  • 全球天气预报

    支持全球约2.4万个城市地区天气查询,如:天气实况、逐日天气预报、24小时历史天气等

    支持全球约2.4万个城市地区天气查询,如:天气实况、逐日天气预报、24小时历史天气等

  • 购物小票识别

    支持识别各类商场、超市及药店的购物小票,包括店名、单号、总金额、消费时间、明细商品名称、单价、数量、金额等信息,可用于商品售卖信息统计、购物中心用户积分兑换及企业内部报销等场景

    支持识别各类商场、超市及药店的购物小票,包括店名、单号、总金额、消费时间、明细商品名称、单价、数量、金额等信息,可用于商品售卖信息统计、购物中心用户积分兑换及企业内部报销等场景

  • 涉农贷款地址识别

    涉农贷款地址识别,支持对私和对公两种方式。输入地址的行政区划越完整,识别准确度越高。

    涉农贷款地址识别,支持对私和对公两种方式。输入地址的行政区划越完整,识别准确度越高。

  • 人脸四要素

    根据给定的手机号、姓名、身份证、人像图片核验是否一致

    根据给定的手机号、姓名、身份证、人像图片核验是否一致

  • 个人/企业涉诉查询

    通过企业关键词查询企业涉讼详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

    通过企业关键词查询企业涉讼详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

0512-88869195
数 据 驱 动 未 来
Data Drives The Future