Python 执行系统命令

简介

Python 执行系统命令有很多种方法,下面给出了常见的四种方式。

os.system

os.system 直接调用标准 C 的 system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息,返回脚本的退出状态码。

用于测试的 shell 脚本 test.sh
echo "Hello World!!!"
exit 3
测试
>>> import os
>>> status = os.system("bash test.sh")
Hello World!!!
>>> status
768
>>> status >> 8
3

该方法在调用完 shell 脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码。 返回的结果都是0(使用位运算向右位移8位得到的结果就是高位值),代表代码正常退出。我们如果需要的到脚本执行后返回的状态码,可以使用位运算得到。

os.popen

这种调用方法是通过管道的方式来实现的,函数返回一个 file-like 的对象,里面的内容是脚本输出的内容(可以简单的理解为 echo 的输出内容)。

用于测试的 shell 脚本 test.sh
echo "Hello World!!!"
测试
>>> import os
>>> output = os.popen("bash test.sh")
>>> output
<open file 'bash test.sh', mode 'r' at 0x1031bd780>
>>> output.read()
'Hello World!!!\n'
>>>

commands 模块

1. getstatusoutput(cmd)
使用 os.popen() 执行命令 cmd ,然后返回两个元素的元组(status, result)。执行方式: { cmd; } 2>&1 ,返回结果里包含标准输出和标准错误。

2. getoutput(cmd)
只返回执行的结果,忽略状态码。

3. getstatus(file)
返回 ls -ld file 执行的结果

测试
>>> import commands
>>> status, output = commands.getstatusoutput("bash test.sh")
>>> status
768
>>> output
'Hello World!!!'

subprocess 模块

功能强大的子进程管理模块。

测试
>>> import subprocess
>>> p = subprocess.Popen("bash test.sh", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
>>> p.stdout.read()
'Hello World!!!\n'
>>> p.stderr.read()
''