环境
ubuntu22.4,python3.10.12
介绍
在 Python 中调用 Bash 命令通常涉及到使用内置的 subprocess
模块,commands
模块只在python2中使用。
1. 使用 os.system
os.system
是最简单的方法之一,但不推荐,因为它不够灵活且安全性较差, 在执行有交互的命令时更一脸懵
import os
# 调用简单的Bash命令
os.system('ls -l')
2. 使用 subprocess
模块
subprocess
模块提供了更强大和灵活的方式来调用外部命令,并且可以捕获输出、处理错误等。
2.1 subprocess.run
(Python 3.7+)
subprocess.run
是推荐的方式,因为它提供了简洁的API并且功能强大。
import subprocess
# 调用简单的Bash命令
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
# 输出结果
print("stdout:", result.stdout)
print("stderr:", result.stderr)
print("returncode:", result.returncode)
2.2 subprocess.Popen
如果你需要更复杂的控制,比如与子进程进行交互,可以使用 subprocess.Popen
。
import subprocess
# 启动一个Bash命令
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# 获取输出和错误
stdout, stderr = process.communicate()
# 输出结果
print("stdout:", stdout)
print("stderr:", stderr)
print("returncode:", process.returncode)
if stderr:
print(stderr)
stdout=subprocess.PIPE
和 stderr=subprocess.PIPE
表示将标准输出和标准错误重定向到管道中,以便稍后读取。
如果要对返回结果进行判断操作,可以使用此函数
3. 使用 subprocess.check_output
和 subprocess.check_call
这两个函数是 subprocess
模块中的便捷函数,适用于不需要复杂交互的情况。
3.1 subprocess.check_output
subprocess.check_output
用于执行命令并返回标准输出。
import subprocess
try:
output = subprocess.check_output(['ls', '-l'], text=True)
print("Output:", output)
except subprocess.CalledProcessError as e:
print("Error:", e)
3.2 subprocess.check_call
subprocess.check_call
用于执行命令并检查返回码,如果返回码不是0则抛出异常。
import subprocess
try:
subprocess.check_call(['ls', '-l'])
except subprocess.CalledProcessError as e:
print("Error:", e)
import subprocess
import tempfile
# 创建一个临时文件并写入Bash脚本
with tempfile.NamedTemporaryFile(mode='w+', delete=False) as temp_file:
temp_file.write("""
#!/bin/bash
echo "Hello, World!"
ls -l
""")
temp_file_name = temp_file.name
# 设置文件可执行权限
subprocess.run(['chmod', '+x', temp_file_name])
# 执行临时文件中的Bash脚本
result = subprocess.run([temp_file_name], capture_output=True, text=True)
# 输出结果
print("stdout:", result.stdout)
print("stderr:", result.stderr)
print("returncode:", result.returncode)
# 删除临时文件
import os
os.remove(temp_file_name)
4. 直接在Python中执行多行Bash命令
你也可以直接在Python中执行多行Bash命令,通过将命令写成字符串并传递给 subprocess
函数。
import subprocess
# 多行Bash命令
bash_command = """
echo "Hello, World!"
ls -l
"""
# 使用shell=True来执行多行Bash命令
result = subprocess.run(bash_command, shell=True, capture_output=True, text=True)
# 输出结果
print("stdout:", result.stdout)
print("stderr:", result.stderr)
print("returncode:", result.returncode)