Python subprocess 模块:执行外部命令的利器

行业资讯 admin 发布时间:2024-04-15 浏览:8 次

更多Python学习内容:ipengtao.com

在 Python 中,subprocess 模块提供了一种强大的方式来执行外部命令并与之交互。无论是运行系统命令、调用其他可执行文件,还是与其他进程进行通信,subprocess 都能胜任。本文将全面介绍 Python 的 subprocess 模块,包括其基本用法、高级功能以及实际应用场景,并提供丰富的示例代码,帮助深入理解和灵活运用这个强大的工具。

subprocess 模块概述

subprocess 模块允许 Python 程序创建新的进程、连接到子进程的输入/输出/错误管道,并获取其返回值。它提供了一种更加灵活和可靠的方法来执行外部命令,取代了过时的 os.system 和 os.spawn* 函数。

执行简单的外部命令

要执行一个简单的外部命令,只需调用 subprocess 模块的 run 函数即可。

import

 subprocess

result = subprocess.run(["ls""-l"], capture_output=True, text=True

)

print(result.stdout)

上述代码运行了 ls -l 命令,并将输出结果打印出来。

获取命令执行结果

可以通过 subprocess 模块的 run 函数来获取命令执行的返回结果。

result = subprocess.run(["echo""Hello, World!"], capture_output=True, text=True

)

print(result.returncode)

returncode 属性表示命令执行的返回码。

与子进程交互

subprocess 模块允许与子进程进行交互,包括向子进程发送输入、读取子进程的输出等操作。

process = subprocess.Popen(["cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True

)

process.stdin.write("Hello, subprocess!\n"

)

process.stdin.close()

output = process.stdout.read()

print(output)

上述代码演示了如何使用 Popen 类创建一个子进程,并向其发送输入,然后读取其输出。

使用 shell 命令

可以通过 shell 参数执行 shell 命令,但需谨慎防止命令注入漏洞。

result = subprocess.run("ls -l", shell=True, capture_output=True, text=True

)

print(result.stdout)

异常处理

在执行外部命令时,可能会出现各种异常情况,如命令不存在、命令执行错误等。因此,在编写代码时,应该进行异常处理。

try

:

    subprocess.run(["unknown_command"], check=True

)

except subprocess.CalledProcessError as

 e:

    print("命令执行失败:"

, e)

上述代码通过 check=True 参数来确保命令执行失败时会抛出异常。

高级功能

除了基本的命令执行外,subprocess 模块还提供了一些高级功能,使得外部命令的执行更加灵活和可控。

1. 使用管道连接多个命令

有时候需要将多个命令连接起来执行,可以利用管道实现。subprocess 模块可以创建管道来连接多个子进程,实现复杂的命令组合。

import

 subprocess

# 使用管道连接两个命令:cat 和 grepcat_process = subprocess.Popen(["cat""example.txt"

], stdout=subprocess.PIPE)

grep_process = subprocess.Popen(["grep""keyword"

], stdin=cat_process.stdout, stdout=subprocess.PIPE)

cat_process.stdout.close()  # 关闭 cat 进程的标准输出output = grep_process.communicate()[0]  # 获取 grep 进程的输出

print(output.decode())

上述代码中,cat 命令用于将文件内容输出,grep 命令用于在输出中搜索指定的关键字。

2. 设置超时时间

有时候希望对命令执行设置超时时间,以防止程序长时间阻塞。subprocess 模块可以设置超时时间,当命令执行超时时,会抛出 TimeoutExpired 异常。

import

 subprocess

try

:

    subprocess.run(["sleep""10"], timeout=5

)

except

 subprocess.TimeoutExpired:

    print("命令执行超时"

)

上述代码中,尝试执行一个耗时较长的 sleep 10 命令,但设置了超时时间为 5 秒,所以会在 5 秒后抛出超时异常。

3. 设置环境变量

有时候需要在执行外部命令时设置特定的环境变量,可以通过 env 参数来实现。

import

 subprocess

# 设置环境变量env = {"PATH""/usr/bin"

}

subprocess.run(["ls"

], env=env)

上述代码中,设置了 PATH 环境变量为 /usr/bin,然后执行 ls 命令,这样就可以在指定的环境中执行命令。

4. 捕获标准错误输出

有时候需要捕获命令执行的标准错误输出,可以通过 stderr 参数来实现。

import

 subprocess

result = subprocess.run(["unknown_command"], capture_output=True, text=True

, stderr=subprocess.PIPE)

print("标准错误输出:"

, result.stderr)

上述代码中,执行一个不存在的命令,并捕获了标准错误输出。

应用场景

subprocess 模块在实际应用中有许多场景,以下是一些常见的应用场景及对应的示例代码:

1. 调用系统命令执行操作

有时候需要在 Python 程序中执行一些系统命令,比如创建目录、复制文件等操作。

import

 subprocess

# 创建一个名为 "new_dir" 的目录subprocess.run(["mkdir""new_dir"

])

2. 与其他进程进行通信

通过 subprocess 模块,可以启动其他的可执行文件,并与其进行交互,比如发送输入、接收输出等。

import

 subprocess

# 启动一个简单的计算器程序,并向其发送输入process = subprocess.Popen(["bc"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True

)

process.stdin.write("2 + 2\n"

)

process.stdin.flush()

output = process.stdout.readline()

print(output.strip())  # 输出:4

3. 执行并行任务

在一些场景下,需要同时执行多个任务,可以通过 subprocess 模块来实现并行执行。

import

 subprocess

# 同时执行两个命令:ls 和 pwdls_process = subprocess.Popen(["ls"], stdout=subprocess.PIPE, text=True

)

pwd_process = subprocess.Popen(["pwd"], stdout=subprocess.PIPE, text=True

)

# 获取命令执行结果ls_output = ls_process.communicate()[0

]

pwd_output = pwd_process.communicate()[0

]

print("ls 命令输出:"

, ls_output)

print("pwd 命令输出:"

, pwd_output)

4. 批量处理数据

在一些数据处理任务中,需要调用外部工具或脚本来处理数据,subprocess 模块可以批量执行这些处理任务。

import

 subprocess

# 批量处理文件,调用外部脚本对每个文件进行处理files = ["file1.txt""file2.txt""file3.txt"

]

for file in

 files:

    subprocess.run(["process_script.sh"

, file])

5. 控制台应用程序

有时候需要在 Python 中启动一个控制台应用程序,并与用户进行交互,subprocess 模块可以很方便地实现这一功能。

import

 subprocess

# 启动一个交互式的控制台应用程序subprocess.run(["python""-i"

])

总结

Python 的 subprocess 模块为执行外部命令提供了强大而灵活的功能。无论是简单的命令执行,还是复杂的进程交互,都可以通过 subprocess 模块轻松实现。建议开发者在实际项目中充分利用 subprocess 模块提供的各种功能,以提高程序的可扩展性和可维护性。

如果你觉得文章还不错,请大家 点赞、分享、留言 ,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com

果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

我们还为大家准备了Python资料和副业项目合集,感兴趣的小伙伴快来找我领取一起交流学习哦!往期推荐

Python 中的 iter() 函数:迭代器的生成工具

Python 中的 isinstance() 函数:类型检查的利器

Python 中的 sorted() 函数:排序的利器

Python 中的 hash() 函数:哈希值的奥秘

Python 中的 slice() 函数:切片的利器

Python 的 tuple() 函数:创建不可变序列

点击下方“阅读原文”查看更多

在线咨询

点击这里给我发消息售前咨询专员

点击这里给我发消息售后服务专员

在线咨询

免费通话

24h咨询:400-888-8888


如您有问题,可以咨询我们的24H咨询电话!

免费通话

微信扫一扫

微信联系
返回顶部