python执行shell命令或可执行程序的subprocess模块

官网文档: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() 是设置了 encodingerrors 或者 text=True 来运行的. 如果未有捕获, 则为 None.

如果你通过 stderr=subprocess.STDOUT 运行进程,标准输入和标准错误将被组合在这个属性中,并且 stderr 将为 None

stderr

捕获到的子进程的标准错误. 一个字节序列, 或者一个字符串, 如果 run() 是设置了参数 encodingerrors 或者 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 的 stdinstdout 或者 stderr 参数使用的特殊值, 表示打开标准流的管道. 常用于 Popen.communicate().

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值