0
点赞
收藏
分享

微信扫一扫

python 调用bash

巧乐兹_d41f 2024-10-16 阅读 23

环境

ubuntu22.4,python3.10.12

介绍

在 Python 中调用 Bash 命令通常涉及到使用内置的 subprocess 模块,commands 模块只在python2中使用。

1. 使用 os.system

os.system 是最简单的方法之一,但不推荐,因为它不够灵活且安全性较差, 在执行有交互的命令时更一脸懵

import os

# 调用简单的Bash命令
os.system('ls -l')

python 调用bash_Bash

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)

python 调用bash_Bash_02

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 表示将标准输出和标准错误重定向到管道中,以便稍后读取。

如果要对返回结果进行判断操作,可以使用此函数

python 调用bash_Python_03

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)

python 调用bash_Python_04


举报

相关推荐

0 条评论