Python2 执行 Shell 脚本

简介

在 Python 中,我们可以使用 subprocess 模块来执行 Shell 命令和脚本。Shell 脚本是一种用于自动化执行一系列命令的脚本文件,它可以帮助我们完成各种任务,如文件操作、系统管理、进程控制等。在本文中,我们将介绍如何使用 Python2 的 subprocess 模块来执行 Shell 脚本,并提供一些示例代码帮助理解。

安装

在使用 subprocess 模块之前,我们需要确保 Python2 已经安装在我们的计算机上。可以通过以下命令来检查 Python2 是否已经安装:

python2 --version

如果已经安装,则会显示 Python2 的版本号。如果未安装,则需要先安装 Python2。可以从 Python 官方网站下载安装程序并按照提示进行安装。

执行 Shell 命令

subprocess 模块提供了多个函数来执行 Shell 命令,其中最常用的是 subprocess.call() 函数。该函数接受一个字符串参数,该参数是要执行的 Shell 命令,例如:

import subprocess

subprocess.call("ls -l", shell=True)

上述代码会执行 ls -l 命令,并将结果打印到控制台。shell=True 参数表示将命令解释为一个完整的 Shell 命令字符串。

除了 subprocess.call() 函数,subprocess 模块还提供了其他函数,例如 subprocess.check_output() 可以获取命令的输出结果,subprocess.Popen() 可以更灵活地执行命令并处理输入输出流等。

执行 Shell 脚本

执行 Shell 脚本与执行单个 Shell 命令类似,只需将脚本的路径作为参数传递给 subprocess.call() 函数即可。例如:

import subprocess

subprocess.call("./script.sh", shell=True)

上述代码会执行名为 script.sh 的 Shell 脚本,并将结果打印到控制台。script.sh 需要与 Python 脚本在同一目录下,或者使用绝对路径来指定其位置。

接收 Shell 命令输出

在执行 Shell 命令或脚本时,我们可以通过 subprocess 模块来获取命令的输出结果。例如,使用 subprocess.check_output() 函数可以获取命令的输出结果作为一个字符串:

import subprocess

output = subprocess.check_output("echo 'Hello, World!'", shell=True)
print(output)

上述代码会执行 echo 'Hello, World!' 命令,并将输出结果打印到控制台。

如果命令的输出结果较大或需要按行处理,可以使用 subprocess.Popen() 函数来处理输入输出流。例如:

import subprocess

p = subprocess.Popen("ls -l", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()

print("Standard Output:")
print(stdout)

print("Standard Error:")
print(stderr)

上述代码会执行 ls -l 命令,并将标准输出和标准错误输出分别保存到 stdoutstderr 变量中,然后打印到控制台。

示例

下面是一个示例,演示如何使用 Python2 执行 Shell 脚本来统计指定目录下不同类型文件的数量,并用饼状图展示结果:

import subprocess
import re
import matplotlib.pyplot as plt

def count_files(directory):
    output = subprocess.check_output("ls -l {}".format(directory), shell=True)

    pattern = r"\s+(\d+)\s+([^\s]+)$"
    files = re.findall(pattern, output, re.MULTILINE)

    file_counts = {}
    for file_info in files:
        file_type = file_info[1].split(".")[-1]
        if file_type not in file_counts:
            file_counts[file_type] = 0
        file_counts[file_type] += 1

    return file_counts

def plot_pie_chart(data):
    labels = list(data.keys())
    sizes = list(data.values())

    plt.pie(sizes, labels=labels, autopct="%1.1f%%")

    plt.axis("equal")
    plt