python3 中执行系统命令
2019-10-08 本文已影响0人
tafanfly
Date | Tags |
---|---|
2019/10/8 | Python3, subprocess |
前言
在Python
中往往需要执行系统命令, 下面这些模块可以帮助完成。
- os.system
- os.popen
- commands
- subprocess
os.system
这是通过调用标准C函数system()命令实现的,并且具有相同的限制条件。
在Unix平台上, 返回值是执行命令的 状态码
,0表示成功,其他表示失败。并将命令执行结果输出到屏幕上。
import os
print (os.system("mkdir test_system"))
0
print (os.system("mkdir test_system"))
mkdir: cannot create directory ‘test_system’: File exists
256
在linux环境中,第一次创建test_system
文件夹成功,返回值为0
, 第二次创建失败,因为文件夹已经有了, 所以返回值为256
。
os.popen
该方法通过调用管道
的方式来实现的,在调用结束后,会返回一个 file 对象,支持read()和write()方法,具体根据command而定。
- 可以
获取命令执行结果
,但无法获取命令执行状态码
- 调用会
阻塞当前线程
,直到运行完毕
os.popen(command [, mode, buffering])
command:调用命令
mode:返回 file 对象的模式,默认为 “r” 只读模式
buffering:缓冲区大小,默认 -1 为无限制
import os
print (os.popen('pwd').read())
/home/ta/workspace
commands
commands模块只存在于Python 2.7+,且不支持Windows平台。
python3.x中移除
, 被subprocess.getstatusoutput()
替代, 由于返回值中无法区分stderr和stdout。
subprocess
联系与区别
函数名 | 描述 | 限制 |
---|---|---|
os.system (cmd) |
返回命令执行状态码 ,并将命令执行结果 输出到屏幕 |
无 |
os.popen (cmd) |
返回file对象 ,调用read()和write()方法获取命令执行结果,无法获取命令执行状态码 |
无 |
commands.getstatusoutput (cmd) |
返回一个元组 (命令执行状态码,执行结果) |
只存在于Python 2.7,且不支持Windows平台, python3.x中移除 , 被subprocess.getstatusoutput() 替代 |
subprocess |
新开一个子进程,让其执行别的程序 | 无 |
在Python中执行系统命令,不同的场景中可以考虑使用不同的函数,但是os.system
,os.popen
,commands.getstatusoutput
这些函数都是可以被subprocess函数
所替代的, 见subprocess-replacements。