一、简介
subprocess模块允许你从Python脚本中启动新的应用程序、连接到它们的输入/输出/错误管道,并获取它们的返回码。这个模块非常强大,因为它提供了与底层操作系统的交互能力,允许你执行系统命令并捕获其输出。
二、基本使用
1.执行命令并获取输出
使用subprocess.run()函数可以执行一个命令并获取其输出。
import subprocess
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)
capture_output=True表示我们要捕获命令的输出,text=True则指定输出应作为文本返回而不是字节。
2.执行命令并获取返回码
subprocess.run()的返回值是一个CompletedProcess实例,你可以通过它的returncode属性获取命令的返回码。
import subprocess
result = subprocess.run(['true'], capture_output=True, text=True)
print(result.returncode) # 输出 0,表示命令成功执行
result = subprocess.run(['false'], capture_output=True, text=True)
print(result.returncode) # 输出 1,表示命令执行失败
3.更复杂的命令执行
使用subprocess.Popen类可以执行更复杂的命令,它提供了更多的选项和控制。
import subprocess
# 使用Popen执行命令
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
if process.returncode != 0:
print(f"Error: {stderr.decode()}")
else:
print(stdout.decode())
Popen构造函数中的stdout=subprocess.PIPE和stderr=subprocess.PIPE允许你捕获命令的标准输出和错误输出。communicate()方法用于等待进程完成并获取输出。
三、高级特性
1.设置环境变量
你可以通过env参数设置环境变量。
import subprocess
env = {'MY_VAR': 'my_value'}
result = subprocess.run(['ls'], env=env)
2.更改工作目录
使用cwd参数可以更改子进程的工作目录。
import subprocess
result = subprocess.run(['ls'], cwd='/tmp')
3.超时
你可以设置命令执行的最大时间,如果超过这个时间,命令将被终止。
import subprocess
result = subprocess.run(['sleep', '5'], timeout=3)
上面的命令将尝试执行sleep 5,但由于设置了超时为3秒,所以命令将在3秒后被终止。
四、注意事项
• 总是确保你执行的命令是安全的,特别是当命令的输入来自不可信的源时。永远不要直接执行来自用户输入的命令,因为这可能导致安全漏洞,如命令注入攻击。
• 使用capture_output=True时,请确保处理大量的输出,因为这可能会导致内存使用增加。
• 尽可能使用subprocess.run(),因为它比subprocess.Popen()更简洁且易于使用。
五、总结
subprocess模块是Python中执行外部命令和脚本的强大工具。通过使用subprocess.run()或subprocess.Popen(),你可以从Python脚本中启动和管理外部进程,并捕获其输出。在处理系统命令时,请始终注意安全性,并确保你的代码是健壮的。
领取专属 10元无门槛券
私享最新 技术干货