python subprocess模块学习笔记
subprocess介绍
subprocess模块用于执行命令行命令。官方推荐的使用方法是使用模块中的run()方法,更高级的方法可以使用下层的Popen()方法。
subprocess.run()
运行参数描述的命令,等待命令完成,并返回一个CompletedProcess实例。
参数中可以控制以下功能:
- 要执行的cmd
- 是否隐式执行shell,默认False。这个的意思是
["ls", "-l"]和ls -l(隐式)的区别,后者会传递shell元字符(如$,*等)和空格,需要注意防止shell注入。 - 捕获标准输出和标准错误输出
- 设置超时
- 开启检查,cmd返回非0则报异常
- 传递环境变量
- ......
subprocess.run()的底层是subprocess.Popen()
class subprocess.CompletedProcess
具有以下功能:
- 获取启动该进程所用的参数
- 获取返回code
- 获取标准输出和标准错误输出
- 检查返回值,若非0则报错
与多进程的区别
参考:
What is the difference between multiprocessing and subprocess?
如果想要调用非python语言的程序,可以用subprocess
如果想要在子进程中调用python函数,用multiprocess
如果想并行调用非python语言的程序,可以使用非阻塞的subprocess.Popen()
与os.system的区别
subprocess.Popen是os.system的严格超集,它比os.system更灵活,替代了包括os.system在内的一些工具。