在 Python 编程中,subprocess 模块是一个非常强大的工具,用于生成新的进程、连接到它们的输入/输出/错误管道,并获取它们的返回码。通过 subprocess 模块,Python 程序可以调用外部命令和程序,从而实现更复杂的功能。本文将详细介绍 subprocess 模块中的常用函数、参数及其作用和用法,帮助读者更好地理解和使用这一模块。
什么是 subprocess 模块
subprocess 模块是 Python 标准库的一部分,提供了创建和管理子进程的能力。
它允许你在 Python 程序中调用外部命令,并与这些命令进行交互,如读取标准输出、写入标准输入等。
subprocess 模块取代了旧的 os.system、os.spawn* 和 os.popen* 等方法,提供了更强大和灵活的功能。
主要功能
创建和管理子进程。
获取子进程的标准输出、标准错误和返回码。
向子进程发送信号。
实现复杂的进程间通信。
作用:运行一个命令并等待其完成。
参数:
args:要执行的命令及其参数,可以是字符串或列表。
stdin:指定子进程的标准输入。
stdout:指定子进程的标准输出。
stderr:指定子进程的标准错误。
capture_output:如果设置为 True,则捕获标准输出和标准错误。
text:如果设置为 True,则以文本模式处理输入和输出;默认为 False,即二进制模式。
check:如果设置为 True,当子进程返回非零退出码时,会抛出 CalledProcessError 异常。
timeout:超时时间(秒),超过该时间后会抛出 TimeoutExpired 异常。
示例代码:
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)
作用:启动一个新的进程,并提供更多的控制选项。
参数:
args:要执行的命令及其参数,可以是字符串或列表。
stdin:指定子进程的标准输入。
stdout:指定子进程的标准输出。
stderr:指定子进程的标准错误。
cwd:指定子进程的工作目录。
env:指定子进程的环境变量。
universal_newlines:如果设置为 True,则以文本模式处理输入和输出;默认为 False,即二进制模式。
示例代码:
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())
作用:运行一个命令,并检查其返回码。如果返回码非零,则抛出 CalledProcessError 异常。
参数:
args:要执行的命令及其参数,可以是字符串或列表。
stdin:指定子进程的标准输入。
stdout:指定子进程的标准输出。
stderr:指定子进程的标准错误。
timeout:超时时间(秒),超过该时间后会抛出 TimeoutExpired 异常。
示例代码:
import subprocess
try:
subprocess.check_call(['ls', '-l'])
except subprocess.CalledProcessError as e:
print(f"Command failed with return code {e.returncode}")
作用:运行一个命令,并捕获其标准输出。如果返回码非零,则抛出 CalledProcessError 异常。
参数:
args:要执行的命令及其参数,可以是字符串或列表。
stdin:指定子进程的标准输入。
stderr:指定子进程的标准错误。
timeout:超时时间(秒),超过该时间后会抛出 TimeoutExpired 异常。
示例代码:
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}")
作用:运行一个命令,并返回其返回码。
参数:
args:要执行的命令及其参数,可以是字符串或列表。
stdin:指定子进程的标准输入。
stdout:指定子进程的标准输出。
stderr:指定子进程的标准错误。
timeout:超时时间(秒),超过该时间后会抛出 TimeoutExpired 异常。
示例代码:
import subprocess
return_code = subprocess.call(['ls', '-l'])
print("Return code:", return_code)
运行简单的命令
示例代码:
import subprocess
result = subprocess.run(['echo', 'Hello, World!'], capture_output=True, text=True)
print("Output:", result.stdout)
捕获标准输出和标准错误
示例代码:
import subprocess
result = subprocess.run(['ls', 'nonexistent_directory'], capture_output=True, text=True)
print("Output:", result.stdout)
print("Error:", result.stderr)
传递环境变量
示例代码:
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)
设置工作目录
示例代码:
import subprocess
result = subprocess.run(['pwd'], cwd='/tmp', capture_output=True, text=True)
print("Output:", result.stdout)
超时处理
示例代码:
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")
向子进程发送信号
示例代码:
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)
多线程或多进程处理
示例代码:
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)
安全问题
使用 shell=True 时要特别小心,因为它可能会导致命令注入攻击。尽量使用列表形式传递命令和参数。
示例代码:
import subprocess
# 不安全的方式
command = "rm -rf /"
subprocess.run(command, shell=True)
# 安全的方式
subprocess.run(['rm', '-rf', '/'])
处理编码问题
在处理文本数据时,确保正确设置编码,避免乱码问题。
示例代码:
import subprocess
result = subprocess.run(['echo', '你好,世界!'], capture_output=True, text=True, encoding='utf-8')
print("Output:", result.stdout)
异常处理
在调用 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)
资源管理
确保在不需要子进程时及时关闭它,释放系统资源。
示例代码:
import subprocess
process = subprocess.Popen(['sleep', '10'])
process.terminate() # 终止子进程
process.wait() # 等待子进程结束
日志记录
在生产环境中,建议记录子进程的输出和错误信息,以便于调试和监控。
示例代码:
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)
subprocess 模块是 Python 中非常强大且灵活的工具,用于管理和控制子进程。本文详细介绍了 subprocess 模块中的常用函数、参数及其作用和用法,并提供了多个示例代码来帮助读者更好地理解和应用这些知识。通过合理使用 subprocess 模块,可以显著提高 Python 程序的功能性和灵活性。希望本文能够帮助读者掌握 subprocess 模块的使用技巧,并在实际项目中发挥其最大效能。
声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com
支持全球约2.4万个城市地区天气查询,如:天气实况、逐日天气预报、24小时历史天气等
支持识别各类商场、超市及药店的购物小票,包括店名、单号、总金额、消费时间、明细商品名称、单价、数量、金额等信息,可用于商品售卖信息统计、购物中心用户积分兑换及企业内部报销等场景
涉农贷款地址识别,支持对私和对公两种方式。输入地址的行政区划越完整,识别准确度越高。
根据给定的手机号、姓名、身份证、人像图片核验是否一致
通过企业关键词查询企业涉讼详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。