python3 中执行系统命令

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

见 python3 中subprocess的运用

联系与区别

函数名 描述 限制
os.system(cmd) 返回命令执行状态码,并将命令执行结果输出到屏幕
os.popen(cmd) 返回file对象,调用read()和write()方法获取命令执行结果,无法获取命令执行状态码
commands.getstatusoutput(cmd) 返回一个元组(命令执行状态码,执行结果) 只存在于Python 2.7,且不支持Windows平台, python3.x中移除, 被subprocess.getstatusoutput()替代
subprocess 新开一个子进程,让其执行别的程序

在Python中执行系统命令,不同的场景中可以考虑使用不同的函数,但是os.systemos.popencommands.getstatusoutput这些函数都是可以被subprocess函数替代的, 见subprocess-replacements。

你可能感兴趣的:(python3 中执行系统命令)