一、os系统模块
Python内置了os系统模块,可以用于执行与操作系统相关的命令,如文件操作、进程管理、环境变量等。其中,os.system()是最为基础和常用的函数,可以帮助我们执行Linux命令。
下面是os.system()的示例代码:
import os
os.system('echo "hello world"')
在Linux终端下执行上述代码,结果为:
hello world
可以看到,os.system()可以帮助我们在Python脚本中执行Linux命令,并且可以获得Linux命令的输出结果。但是,它的缺点也非常明显:它无法获得Linux命令的返回值,因此无法判断命令是否执行成功。
二、subprocess模块
subprocess模块是Python中关于子进程的模块,可以帮助我们更加灵活地调用系统命令,并且能够获取到命令执行的返回值。
下面是subprocess模块的示例代码:
import subprocess
cmd = 'echo "hello world"'
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
status = p.returncode
print("stdout: ", stdout)
print("stderr: ", stderr)
print("status: ", status)
运行上述代码,输出结果为:
stdout: b'hello world\n' stderr: b'' status: 0
可以看到,我们使用subprocess.Popen()函数帮助我们执行了Linux命令,并获取到了Linux的输出结果、错误信息和返回值。其中,Popen()函数支持多种参数,比如:
- shell参数:用于控制是否启用shell
- stdin、stdout、stderr参数:用于控制输入输出的类型和流程
- timeout参数:用于控制执行命令的超时时间
- …
三、subprocess模块的高级应用
除了上述基础的使用方式,subprocess模块还支持许多高级特性,比如:
- 支持管道操作
- 支持工作目录切换
- 支持环境变量的设置
- 支持文件描述符的传递
- 支持捕获子进程信号
- …
下面是示例代码,用于展示subprocess模块的高级特性:
import os
import subprocess
# 管道操作
cmd1 = 'echo "hello" | sed s/hello/hi/g'
p1 = subprocess.Popen(cmd1, shell=True)
p1.wait()
# 工作目录切换
os.chdir('/tmp')
cmd2 = 'pwd'
p2 = subprocess.Popen(cmd2, shell=True, stdout=subprocess.PIPE)
stdout, _ = p2.communicate()
print("cwd: ", stdout.strip())
# 环境变量的设置
env = os.environ.copy()
env['PATH'] = env['PATH'] + ':/usr/local/bin'
cmd3 = 'echo $PATH'
p3 = subprocess.Popen(cmd3, shell=True, env=env, stdout=subprocess.PIPE)
stdout, _ = p3.communicate()
print("PATH: ", stdout.strip())
# 文件描述符传递
cmd4 = 'ls'
p4 = subprocess.Popen(cmd4, shell=True, stdout=subprocess.PIPE)
with open('/tmp/ls.txt', 'wb') as f:
f.write(p4.stdout.read())
# 捕获子进程信号
def on_signal(signum, frame):
print("Received signal ", signum)
cmd5 = 'sleep 10'
p5 = subprocess.Popen(cmd5, shell=True)
signal.signal(signal.SIGTERM, on_signal)
time.sleep(1)
p5.terminate()
总的来说,subprocess模块是Python中一个非常强大的系统模块,参考官方文档使用时请一定要注意各种参数的使用规则,以及与其他模块的配合使用。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/254075.html
微信扫一扫
支付宝扫一扫