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