Python subprocess 模块:执行外部命令的利器
更多Python学习内容:ipengtao.com
在 Python 中,subprocess 模块提供了一种强大的方式来执行外部命令并与之交互。无论是运行系统命令、调用其他可执行文件,还是与其他进程进行通信,subprocess 都能胜任。本文将全面介绍 Python 的 subprocess 模块,包括其基本用法、高级功能以及实际应用场景,并提供丰富的示例代码,帮助深入理解和灵活运用这个强大的工具。
subprocess 模块概述
subprocess 模块允许 Python 程序创建新的进程、连接到子进程的输入/输出/错误管道,并获取其返回值。它提供了一种更加灵活和可靠的方法来执行外部命令,取代了过时的 os.system 和 os.spawn* 函数。
执行简单的外部命令
要执行一个简单的外部命令,只需调用 subprocess 模块的 run 函数即可。
importsubprocess
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 ase:
print("命令执行失败:", e)
上述代码通过 check=True 参数来确保命令执行失败时会抛出异常。
高级功能
除了基本的命令执行外,subprocess 模块还提供了一些高级功能,使得外部命令的执行更加灵活和可控。
1. 使用管道连接多个命令
有时候需要将多个命令连接起来执行,可以利用管道实现。subprocess 模块可以创建管道来连接多个子进程,实现复杂的命令组合。
importsubprocess
# 使用管道连接两个命令: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 异常。
importsubprocess
try:
subprocess.run(["sleep", "10"], timeout=5)
exceptsubprocess.TimeoutExpired:
print("命令执行超时")
上述代码中,尝试执行一个耗时较长的 sleep 10 命令,但设置了超时时间为 5 秒,所以会在 5 秒后抛出超时异常。
3. 设置环境变量
有时候需要在执行外部命令时设置特定的环境变量,可以通过 env 参数来实现。
importsubprocess
# 设置环境变量env = {"PATH": "/usr/bin"}
subprocess.run(["ls"], env=env)
上述代码中,设置了 PATH 环境变量为 /usr/bin,然后执行 ls 命令,这样就可以在指定的环境中执行命令。
4. 捕获标准错误输出
有时候需要捕获命令执行的标准错误输出,可以通过 stderr 参数来实现。
importsubprocess
result = subprocess.run(["unknown_command"], capture_output=True, text=True, stderr=subprocess.PIPE)
print("标准错误输出:", result.stderr)
上述代码中,执行一个不存在的命令,并捕获了标准错误输出。
应用场景
subprocess 模块在实际应用中有许多场景,以下是一些常见的应用场景及对应的示例代码:
1. 调用系统命令执行操作
有时候需要在 Python 程序中执行一些系统命令,比如创建目录、复制文件等操作。
importsubprocess
# 创建一个名为 "new_dir" 的目录subprocess.run(["mkdir", "new_dir"])
2. 与其他进程进行通信
通过 subprocess 模块,可以启动其他的可执行文件,并与其进行交互,比如发送输入、接收输出等。
importsubprocess
# 启动一个简单的计算器程序,并向其发送输入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()) # 输出:43. 执行并行任务
在一些场景下,需要同时执行多个任务,可以通过 subprocess 模块来实现并行执行。
importsubprocess
# 同时执行两个命令: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 模块可以批量执行这些处理任务。
importsubprocess
# 批量处理文件,调用外部脚本对每个文件进行处理files = ["file1.txt", "file2.txt", "file3.txt"]
for file infiles:
subprocess.run(["process_script.sh", file])
5. 控制台应用程序
有时候需要在 Python 中启动一个控制台应用程序,并与用户进行交互,subprocess 模块可以很方便地实现这一功能。
importsubprocess
# 启动一个交互式的控制台应用程序subprocess.run(["python", "-i"])
总结
Python 的 subprocess 模块为执行外部命令提供了强大而灵活的功能。无论是简单的命令执行,还是复杂的进程交互,都可以通过 subprocess 模块轻松实现。建议开发者在实际项目中充分利用 subprocess 模块提供的各种功能,以提高程序的可扩展性和可维护性。
如果你觉得文章还不错,请大家 点赞、分享、留言 ,因为这将是我持续输出更多优质文章的最强动力!
更多Python学习内容:ipengtao.com
如果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。
我们还为大家准备了Python资料和副业项目合集,感兴趣的小伙伴快来找我领取一起交流学习哦!往期推荐Python 中的 iter() 函数:迭代器的生成工具
Python 中的 isinstance() 函数:类型检查的利器
Python 中的 sorted() 函数:排序的利器
Python 中的 hash() 函数:哈希值的奥秘
Python 中的 slice() 函数:切片的利器
点击下方“阅读原文”查看更多