Python的subprocess模块是一个非常强大的模块,它可以帮助我们在Python程序中执行系统命令。subprocess模块提供了一种处理系统进程的统一方法,能够操纵并获取其输出。通过subprocess模块,我们可以在新的进程里启动子程序,输入/输出数据,并获取它的返回值。
基本用法
最常用的函数是subprocess.run()。这个函数可以接收命令行参数和一些其他的可选参数,然后创建新的进程来执行这个命令,等待命令执行完毕,并返回一个称为CompletedProcess的结果对象。
import subprocess
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print('returncode:', result.returncode)
print('Have error:', result.stderr)
print('output:', result.stdout)
在上例中,我们给run传入了命令 ls -l,capture_output设置成True,使它能够捕获输出结果,text设为True表示我们想要输出的内容为文本形式,否则输出的将是字节。
returncode属性表示子进程的返回状态码,一般来说,0表示成功,非0表示出错。
**注意:**在Python 3.7或更早版本中,需要使用stdout=subprocess.PIPE 和 stderr=subprocess.PIPE代替capture_output=True。
高级用法
更复杂一些的用法可能包括输入数据到子进程,或者处理长时间运行的进程。
如果你需要向子进程输入数据,你可以使用subprocess.Popen()。这个函数会返回一个Popen对象,这个对象有stdin, stdout, 和stderr等属性,表示子进程序的输入、输出和错误。
import subprocess
p = subprocess.Popen(['cat'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
stdout, stderr = p.communicate('hello, world')
print('stdout:', stdout)
如需求处理一个长时间运行的进程,我们可以使用Popen对象的.poll()或.wait()方法:
import subprocess
import time
p = subprocess.Popen(['sleep', '5'])
while p.poll() is None:
print('Still sleeping')
time.sleep(1)
print('Not sleeping any longer. Exit code:', p.returncode)
首先,我们使用 sleep 5新建了一个子进程,然后检查它是否已完成。如果子进程还在运行,我们就等待一秒再检查,直到子进程完成。最后,我们打印出子进程的退出码。
运行shell序列
有时,我们可能希望直接在Python中运行一个复杂的shell命令,可以使用shell=True来实现:
import subprocess
command = 'echo "HELLO, WORLD" | wc -c'
p = subprocess.run(command, shell=True, capture_output=True, text=True)
print(p.stdout)
在这里,我们运行了一个shell命令序列,它首先使用echo打印出一句话,然后通过管道将结果传递给wc -c来计算字符的数量。
错误处理
subprocess模块也有异常处理的能力。如果一个子进程的退出码非零(也就是说,它以错误状态退出),我们可以让subprocess抛出一个CalledProcessError异常:
import subprocess
try:
subprocess.run(['false'], check=True)
except subprocess.CalledProcessError as e:
print('Error: ', e)
在这个例子中,我们运行了一个总是会失败的命令false,并通过check=True告诉subprocess在这个命令失败时抛出一个异常。
结论:subprocess模块是Python的重要组成部分,对于需要处理子进程,控制输入和输出,以及进行命令行交互的程序或脚本来说,它提供了强大的工具。通过以上的使用技巧,我信任你将能更好地理解和使用subprocess模块。
云服务器推荐
蓝易云国内/海外高防云服务器推荐
蓝易云采用KVM高性能架构,稳定可靠,安全无忧!
蓝易云服务器真实CN2回国线路,不伪造,只做高质量海外服务器。
海外免备案云服务器链接:www.tsyvps.com
蓝易云香港五网CN2 GIA/GT精品网络服务器。拒绝绕路,拒绝不稳定。