1、subprocess对比os.system()的优势
subprocess
比os.system()
更灵活,可以得到stdout
,stderr
,获到状态代码,更好的错误处理等,官方建议使用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"])
相关文档:
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)