Python 子进程中的运行方法
调用subprocess的推荐方法是对于它可以处理的所有使用场景都使用run()
函数。
run()
函数是在Python 3.5中添加的,如果在老版本中使用,需要下载并扩展。
扩展安装方式:
$ pip install subprocess.run
使用方式:
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False)
运行args描述的命令。等待命令完成,然后返回一个CompletedProcess
实例。
完整的函数形式很大程度上与Popen构造函数相同 —— 除timeout、input和check之外,该函数的所有参数都传递给Popen接口。
>>> subprocess.run(["ls", "-l"]) # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)
>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
class subprocess.CompletedProcess表示从run()
返回的值,表示已完成的进程。
参数
args
args是所有调用所必需的,应该为一个字符串或一个程序参数序列。通常倾向提供参数序列,因为它允许这个模块来处理任何所需的转义和引用参数(例如,允许文件名中的空格)。如果传递单个字符串,shell必须为True
(见下文),否则字符串必须简单地命名要执行的程序而不指定任何参数。
stdin、stdout和stderr
stdin、stdout和stderr分别指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值有PIPE
、DEVNULL
,一个存在的文件描述器(正整数),一个存在的文件对象和None。PIPE表示应该为子进程创建新的管道。DEVNULL表示将使用特殊文件os.devnull。使用默认设置None,则不会发生重定向;子进程的文件句柄将从父进程继承。此外,stderr可以是STDOUT,表示来自子进程的标准错误数据应该捕获到与stdout相同的文件句柄中。
shell
如果shell是True,则将通过shell执行指定的命令。如果你使用Python主要是由于它能提供大多数系统shell不能提供的增强的控制流,并且仍然希望方便地访问其他shell功能,如shell管道、文件名通配符、环境变量扩展和扩展〜到用户的主目录,这会很有用。
>>> from subprocess import run
>>> print run('uname -r')
3.7.0-7-generic
>>> print run('uname -r').stdout
3.7.0-7-generic
>>> run('uname -a').status
0
>>> print run('rm not_existing_directory').stderr
rm: cannot remove `not_existing_directory': No such file or directory
>>> print run('ls -la', 'wc -l')
14
>>> print run('ls -la', 'wc -l', 'wc -c')
3
>>> run('ls -la', 'wc -l', 'wc -c')
ls -la | wc -l | wc -c
>>> print run('ls -la').stdout.lines
['total 20',
'drwxrwxr-x 3 user user 4096 Dec 20 22:55 .',
'drwxrwxr-x 5 user user 4096 Dec 20 22:57 ..',
'drwxrwxr-x 2 user user 4096 Dec 20 22:37 dir',
'-rw-rw-r-- 1 user user 0 Dec 20 22:52 file']
推荐阅读
-
详细解释 Python 中的 __getitem__ 方法和切片对象
-
在 LINUX 中查看进程的 4 种方法(摘要)
-
介绍在 python 中查找列表的五种方法。
-
短视频拍摄中运行摄像机的 6 种常见方法
-
全面了解 python 中的类、对象、方法和属性。
-
python 中四舍五入函数的精度保持方法 --- 将五舍五入为二
-
用 Python 中的先知模型进行天气时间序列预测和异常检测 - 方法
-
解释 Python 中的单元测试 - 运行单元测试
-
[Hadoop2.x] Hadoop 运行一段时间后,stop-dfs 等操作失败 原因及解决方案 - 永久解决方案:修改 $HADOOP_HOME/etc/hadoop/hadoop-env.sh 文件,将 ${HADOOP_PID_DIR} 的 export HADOOP_PID_DIR=${HADOOP_PID_ DIR} 改为你指定的目录,这样 Hadoop 就会将相关的 pid 进程文件保存在指定目录中,避免被 Linux 自动删除。例如 export HADOOP_PID_DIR=/usr/local/hadoop/pids/ 发现问题后的解决方案:
-
使用 Python 中的 unittestreport 生成 HTML 报告、重新运行失败案例、通过电子邮件发送测试报告,并将结果推送到钉钉和微信。