python调用其它程序 os.system os.subprocess
subprocess.Popen是 Python 里启动一个外部进程的工具
https://www.byhy.net/py/lang/extra/callother/
subprocess.Popen是 Python 里启动一个外部进程的工具,让 Python 去执行一个系统命令或启动一个程序
subprocess.Popen(args)里面的args是你想启动的命令,它可以有几种写法,但最推荐写成列表形式
python | subprocess.Popen 使用详解 | 犀牛的博客https://benpaodewoniu.github.io/2022/04/05/python155/
shell=False + 字符串,Linux / POSIX,不会启动 shell,会把整个字符串当成要执行的程序名,windows下会把字符串解析成可执行程序和参数
shell=False + 列表,不经过shell,直接启动可执行程序
shell=True + 字符串,就是明确要求通过 shell 执行
shell=True + 列表,仍然会经过 shell,
shell=True + 列表时,列表最好只有一个完整命令字符串普通程序,shell=False+列表
需要shell语法,需要shell解释,shell=True+字符串
列表形式很像 exec form,推荐使用;字符串形式只有在shell=True时,才是 shell 解释。
列表形式里,第一个元素就是要启动的程序,第一个元素必须是系统能找到的可执行程序
列表形式,直接执行程序。列表形式里,第一个元素就是要启动的程序,第一个元素必须是系统能找到的可执行程序
字符串 +shell=True,交给 shell 执行
shell =True,PIPE
shell =True 打开一个命令行解释器,让命令行解释器执行命令。即linux上是shell,windows是cmd。
shell=False + 字符串,Linux / POSIX,不会启动 shell,会把整个字符串当成要执行的程序名,windows下会把字符串解析成可执行程序和参数
shell=True + 字符串,就是明确要求通过 shell 执行
shell=False + 列表,不经过shell,直接启动可执行程序
shell=True + 列表,仍然会经过 shell,shell=True + 列表时,列表最好只有一个完整命令字符串
shell=True + 列表时,列表最好只有一个完整命令字符串
# PIPE运行命令后命令的输出不要输出的终端上了,而是输出到管道里,然后我们的程序在从管道里读出来。
stdin ,stdout ,stderr
程序默认都有3 个标准流,可以理解成程序和外界交流的 3 个通道
0 stdin 标准输入 程序从这里读数据
1 stdout 标准输出 程序把正常结果写到这里
2 stderr 标准错误 程序把错误信息写到这里
stdin stdout和stderr,分别表示程序的标准输入、标准输出和标准错误。可选的值有PIPE或者一个有效的文件描述符(其实是个正整数)或者一个文件对象,还有None。如果是PIPE,则表示需要创建一个新的管道,如果是None,不会做任何重定向工作,子进程的文件描述符会继承父进程的。另外,stderr的值还可以是STDOUT,表示子进程的标准错误也输出到标准输出。
stdin、stdout、stderr是用来控制子进程“从哪里读输入、把正常输出写到哪里、把错误输出写到哪里”的。
不设置
stdout/stderr,子进程输出直接显示在当前窗口(子进程的输出默认继承父进程);设置成subprocess.PIPE,Python 就会把输出接回来,你可以通过communicate()或read()读取
子进程不是“把消息输入到
p.stdout里”,而是把正常输出写到自己的stdout通道,把错误输出写到自己的stderr通道。
Python 用PIPE把这两个通道接回来,于是父进程这边就可以通过p.stdout、p.stderr读取。可以画成这样:
子进程正常输出 stdout ---> 管道 ---> 父进程 p.stdout 子进程错误输出 stderr ---> 管道 ---> 父进程 p.stderr
cwd:让子进程在指定目录下运行。
cwd只是影响子进程,不会改变当前 Python 主程序所在目录
executable参数:
executable 很少用,主要是在 shell=True 时指定“用哪个 shell 来解释命令”
指定要执行的程序。它很少会被用到:一般程序可以由args 参数指定。如果shell=True ,executable 可以用于指定用哪个shell来执行(比如bash、csh、zsh等)。*nix下,默认是 /bin/sh ,windows下,就是环境变量 COMSPEC 的值(一般是cmd)。windows下,只有当你要执行的命令确实是shell内建命令(比如dir ,copy 等)时,你才需要指定shell=True
示例
python | subprocess.Popen 使用详解 | 犀牛的博客
