python subprocess.run 详解
一、详解
subprocess.run 是 Python 3.5 及以上版本中引入的一个函数,用于运行子进程。它是 subprocess 模块的一部分,提供了一种更简单和更强大的方式来创建和管理子进程。subprocess.run 函数可以替代旧的 os.system 和 subprocess.call 等函数。
以下是 subprocess.run 函数的详细解释:
1.1、基本用法
import subprocess
result = subprocess.run(['ls', '-l'])
在这个例子中,subprocess.run 执行了 ls -l 命令,并等待命令完成。
1.2、参数详解
- args: 要执行的命令及其参数。可以是一个字符串或一个字符串列表。
- stdin, stdout, stderr: 分别表示标准输入、标准输出和标准错误。可以是 subprocess.PIPE、文件对象或文件描述符。
- input: 传递给子进程的输入数据。
- timeout: 子进程的超时时间(以秒为单位)。如果子进程在指定时间内没有完成,将抛出 subprocess.TimeoutExpired 异常。
- check: 如果设置为 True,并且子进程返回一个非零退出状态码,将抛出 subprocess.CalledProcessError 异常。
- encoding: 如果指定了 encoding,则 stdin, stdout, stderr 将被解码为字符串。
- errors: 用于指定如何处理解码错误。
- shell: 如果设置为 True,将通过 shell 执行命令。
- cwd: 设置子进程的当前工作目录。
- env: 用于指定子进程的环境变量。
1.3、返回值
subprocess.run 返回一个 CompletedProcess 对象,包含以下属性:
- args: 执行的命令及其参数。
- returncode: 子进程的退出状态码。
- stdout: 子进程的标准输出(如果 stdout 参数设置为 subprocess.PIPE)。
- stderr: 子进程的标准错误(如果 stderr 参数设置为 subprocess.PIPE)。
1.4、示例
捕获输出
result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print(result.stdout)
处理错误
try:
result = subprocess.run(['ls', '-l', '/nonexistent'], check=True)
except subprocess.CalledProcessError as e:
print(f"Error: {e}")
使用超时
try:
result = subprocess.run(['sleep', '10'], timeout=5)
except subprocess.TimeoutExpired as e:
print(f"Timeout: {e}")
通过 shell 执行命令
result = subprocess.run('echo $HOME', shell=True, text=True)
print(result.stdout)
1.5、总结
subprocess.run 提供了一种灵活且强大的方式来执行子进程,并且可以通过各种参数来控制子进程的行为和处理其输出。通过合理使用这些参数,可以满足大多数子进程管理的需求。
二、subprocess.run执行python文件
在 Python 中,你可以使用 subprocess.run 来执行另一个 Python 文件。subprocess.run 是 Python 3.5 及以上版本中推荐的用于运行子进程的函数。下面是一个示例,展示了如何使用 subprocess.run 来执行另一个 Python 文件:
假设你有一个名为 script_to_run.py 的 Python 文件,你想从另一个 Python 脚本中运行它。
1、创建一个名为 script_to_run.py 的文件,并在其中编写一些代码,例如:
# script_to_run.py
print("Hello from script_to_run.py!")
2、创建另一个 Python 文件,例如 main_script.py,并在其中使用 subprocess.run 来执行 script_to_run.py:
# main_script.py
import subprocess
# 使用 Python 解释器执行 script_to_run.py
result = subprocess.run(['python', 'script_to_run.py'], capture_output=True, text=True)
# 打印子进程的输出
print("Output of script_to_run.py:")
print(result.stdout)
# 打印子进程的错误输出(如果有)
if result.stderr:
print("Errors:")
print(result.stderr)
在这个示例中,subprocess.run 函数的参数解释如下:
- ['python', 'script_to_run.py']:这是一个列表,包含要执行的命令和参数。在这里,我们使用 python 解释器来运行 script_to_run.py 文件。
- capture_output=True:这个参数告诉 subprocess.run 捕获子进程的标准输出和标准错误。
- text=True:这个参数告诉 subprocess.run 将输出和错误作为字符串而不是字节返回。
运行 main_script.py,你应该会看到以下输出:
Output of script_to_run.py:
Hello from script_to_run.py!
如果 script_to_run.py 中有任何错误输出,它们也会被捕获并打印出来。
请注意,如果你使用的是 Python 3.6 或更高版本,你可以使用 subprocess.run 的 check=True 参数来自动检查子进程的返回码,并在子进程返回非零状态码时引发 subprocess.CalledProcessError 异常:
# main_script.py
import subprocess
try:
result = subprocess.run(['python', 'script_to_run.py'], capture_output=True, text=True, check=True)
print("Output of script_to_run.py:")
print(result.stdout)
except subprocess.CalledProcessError as e:
print("Errors:")
print(e.stderr)
这样可以更方便地处理子进程执行失败的情况。