官网文档:https://docs.python.org/zh-cn/3/library/subprocess.html
1、shell=True表示执行的命令是内置shell命令而非$PATH中的某个可执行程序,check=True表示对命令执行产生的异常进行raise抛出,如果不加以捕获则调用subprocess的整个程序将trackback打印异常到标准错误后退出,check=False不对命令执行产生的异常进行raise抛出,如果命令产生异常则返回subprocess.CompleteProcess()描述异常的实例,该实例的check_returncode()方法将返回traceback的整个标准错误文本,内容和check=True时打印到标准错误的traceback文本相同。
>>> subprocess.run('exit 1',shell=True,check=True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/haypin/miniconda3/envs/Py3.9.5/lib/python3.9/subprocess.py", line 528, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1.
>>> subprocess.run('exit 1',shell=False,check=True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/haypin/miniconda3/envs/Py3.9.5/lib/python3.9/subprocess.py", line 505, in run
with Popen(*popenargs, **kwargs) as process:
File "/Users/haypin/miniconda3/envs/Py3.9.5/lib/python3.9/subprocess.py", line 951, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "/Users/haypin/miniconda3/envs/Py3.9.5/lib/python3.9/subprocess.py", line 1821, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'exit 1'
>>> subprocess.run('exit 1',shell=True,check=False)
CompletedProcess(args='exit 1', returncode=1)
>>> res = subprocess.run('exit 1',shell=True,check=False)
>>> dir(res)
['__class__', '__class_getitem__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'args', 'check_returncode', 'returncode', 'stderr', 'stdout']
>>> res.returncode
1
>>> res.check_returncode
<bound method CompletedProcess.check_returncode of CompletedProcess(args='exit 1', returncode=1)>
>>> res.check_returncode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/haypin/miniconda3/envs/Py3.9.5/lib/python3.9/subprocess.py", line 460, in check_returncode
raise CalledProcessError(self.returncode, self.args, self.stdout,
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1.
>>>
2、
class subprocess.
CompletedProcess
run()
的返回值, 代表一个进程已经结束.
args
被用作启动进程的参数. 可能是一个列表或字符串.
returncode
子进程的退出状态码. 通常来说, 一个为 0 的退出码表示进程运行正常.
一个负值 -N
表示子进程被信号 N
中断 (仅 POSIX).
stdout
从子进程捕获到的标准输出. 一个字节序列, 或一个字符串, 如果 run()
是设置了 encoding, errors 或者 text=True
来运行的. 如果未有捕获, 则为 None
.
如果你通过 stderr=subprocess.STDOUT
运行进程,标准输入和标准错误将被组合在这个属性中,并且 stderr
将为 None
。
stderr
捕获到的子进程的标准错误. 一个字节序列, 或者一个字符串, 如果 run()
是设置了参数 encoding, errors 或者 text=True
运行的. 如果未有捕获, 则为 None
.
check_returncode
()
如果 returncode
非零, 抛出 CalledProcessError
.
>>> import subprocess
>>> subprocess.run('ls -l',shell=True,capture_output=True)
CompletedProcess(args='ls -l', returncode=0, stdout=b'total 0\ndrwxr-xr-x 4 haypin staff 128 8 4 2020 Proj0804\ndrwxr-xr-x 18 haypin staff 576 7 12 12:08 lift_strategy\ndrwxr-xr-x 30 root staff 960 7 17 01:50 mp4\ndrwxr-xr-x 4 haypin staff 128 9 30 2020 untitled\n', stderr=b'')
>>>
3、
subprocess.
PIPE
¶
可被 Popen
的 stdin, stdout 或者 stderr 参数使用的特殊值, 表示打开标准流的管道. 常用于 Popen.communicate()
.