深入探索Python中subprocess.run()函数的使用方法与实例

在Python中,subprocess.run() 函数是用于运行外部命令或程序的一个便捷接口。它是 subprocess 模块在Python 3.5及以上版本中引入的一个高级API,用于替代较旧的 subprocess.call()subprocess.check_call() 和 subprocess.check_output() 函数。subprocess.run() 会等待命令完成,并返回一个 CompletedProcess 实例,该实例包含了命令的返回码、标准输出和标准错误输出。

图片[1]_深入探索Python中subprocess.run()函数的使用方法与实例_知途无界

以下是 subprocess.run() 的具体使用方法和一些示例:

基本用法

import subprocess

# 运行一个简单的命令,比如列出当前目录的内容
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)

# 打印命令的返回码
print('Return code:', result.returncode)

# 打印命令的标准输出
print('Standard Output:', result.stdout)

# 打印命令的标准错误输出(如果有的话)
print('Standard Error:', result.stderr)

参数说明

  • args:要运行的命令和参数,通常是一个列表,其中第一个元素是命令名,后续元素是传递给该命令的参数。也可以是一个字符串,但使用列表可以避免shell注入攻击。
  • capture_output:如果设置为 True,则捕获标准输出和标准错误输出,并将它们分别存储在 CompletedProcess 实例的 stdout 和 stderr 属性中。
  • text:如果设置为 True,则将标准输出和标准错误输出作为字符串处理(在Python 3.7及以上版本中可用)。如果为 False(默认值),则输出为字节串。
  • shell:如果设置为 True,则通过shell运行命令(比如bash)。这可能会带来安全风险,特别是当命令字符串包含来自不可信源的数据时。默认为 False
  • check:如果设置为 True,并且命令返回非零退出状态,则 subprocess.run() 会引发一个 CalledProcessError 异常。默认为 False

示例

运行一个简单的命令

result = subprocess.run(['echo', 'Hello, World!'], capture_output=True, text=True, shell=False)
print(result.stdout)

捕获并处理错误

try:
    result = subprocess.run(['ls', '/nonexistent_directory'], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:
    print('Command failed with return code:', e.returncode)
    print('Error output:', e.stderr)

使用shell特性(注意安全性)

# 注意:使用shell=True时要小心,避免shell注入攻击
result = subprocess.run('echo $HOME', capture_output=True, text=True, shell=True)
print(result.stdout.strip())

注意事项

  • 当使用 shell=True 时,确保命令字符串是安全的,避免将不受信任的数据直接传递给shell。
  • capture_output=True 和 text=True 是常用的组合,但根据你的需求,你可能只需要其中一个或另一个。
  • 如果命令可能会产生大量输出,并且你不打算捕获它,那么可以省略 capture_output=True 以避免不必要的内存使用。
  • 使用 check=True 可以让 subprocess.run() 在命令失败时自动引发异常,这有助于在脚本中处理错误情况。
© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞49 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容