Python 使用subprocess调用系统命令方法及示例代码

本文主要介绍Python中,使用subprocess模块调用系统命令方法,和subprocess对比os.system()的优势,以及相关示例代码。

1、subprocess对比os.system()的优势

subprocessos.system()更灵活,可以得到stdoutstderr,获到状态代码,更好的错误处理等,官方建议使用subprocess在替代模块os.system(),该subprocess模块提供了更强大的功能来生成新流程并检索其结果。使用该模块优于使用此功能[ os.system()]。

2、使用subproces调用命令

1) Python 3.5之前的Python版本使用call

import subprocess
subprocess.call(["ls", "-l"])

2) Python 3.5及之后的Python版本使用run

import subprocess
subprocess.run(["ls", "-l"])

相关文档:

subprocess.call

subprocess

3、使用subprocess.Popen调用命令

1) subprocess模块的Popen类

import subprocess

p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
    print line,
retval = p.wait()

可以随意使用stdout管道中的数据执行所需的操作。实际上,您只需忽略这些参数(stdout=和stderr=),它的行为就类似于os.system()。

2) 调用echo获取命令结果

print subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read()

如果要由shell执行的最终命令作为字符串传递,并且有责任对其进行转义。如果您传递的字符串的任何部分不能被完全信任,则将带来严重的安全隐患。例如,如果用户正在输入字符串的某些/任何部分。如果不确定,请仅将这些方法与常量一起使用。为了给您暗示的含义,请参考以下代码:

print subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read()

3) 调用Python脚本

如果想从CGI脚本开始一个长任务。也就是说,子进程的生存期应比CGI脚本执行进程的生存期长。

import subprocess
import sys

# Some code here

pid = subprocess.Popen([sys.executable, "longtask.py"]) # Call subprocess

或者

pid = subprocess.Popen([sys.executable, "longtask.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

推荐阅读
cjavapy编程之路首页