Python3.5使用subprocess.run调用外部程序

Python 3.5的subprocess模块新增了run()函数,大部分调用子进程的场景都推荐使用run()函数,一些高级的用法则可以直接调用Popen 接口。

run()函数

run函数常用参数如下:

run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None)¶

基本用法

运行的命令使用args传给run()函数。args可以是字符串,也可以是一个字符串列表。

[Linux]

subprocess.run("echo 'hi'",shell=True)

subprocess.run(["echo","hi"])

run()函数返回一个CompletedProcess,它包含了命令的参数,返回状态等信息。


>>> run("echo 'hi'",shell=True)
'hi'
CompletedProcess(args="echo 'hi'", returncode=0)

shell

执行命令分为两种情况:

  1. 调用可执行文件执行命令,此时为文件的路径
  2. 执行的是系统Path里的命令,此时为命令名,而非文件路径。

run()函数使用shell来指示这两种情况:

shell=True:表示执行的是系统Path里的命令,python会在命令前加上shell进程(一般情况下,Linux为/bin/sh,Windows为cmd.exe)

subprocess.run("echo 'hi'",shell=True)

shell=False:表示是一个可执行文件,是shell的默认值

在Windows下,执行

subprocess.run("echo 'hi'")

得到报错信息:

FileNotFoundError: [WinError 2] 系统找不到指定的文件。

这个原因是python把echo作为文件来执行。

注意:当shell=True时需要避免shell注入漏洞。

timeout

我们可以给执行的命令指定timeout时间,单位为秒,超时会抛出TimeoutExpired异常。

subprocess.run("echo 'hi'",shell=True,timeout=1)

check

run()函数的check参数是为了替换check_call()函数。ubproces,如果返回的status为非0,则会抛出CalledProcessError

subprocess.run('exit 1', check=True, shell=True)
# subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1.
subprocess.check_call('exit 1', shell=True)
# subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1.

cwd

可以使用cwd指定命令的工作目录。

[Windows]

subprocess.run('dir', shell=True, cwd="C:\\")

标准流

run()函数提供了stdout,stdin和stderr,让我们可以和标准流交互。

subprocess.run('sh info_gathering.sh', stdout=open('comp_info.txt', 'w'), shell=True, encoding='utf-8', bufsize=4096)

版权声明:著作权归作者所有。

相关推荐

Python 3.5拼接列表的新语法

在Python 3.5之前的版本,拼接列表可以有这两种方法:1、列表相加list1 = [1,2,3] list2 = [4,5,6] result = list1 + list2 结果为一个新的列表2、在原来列表上扩展list1 = [1,2,3] list2 = [

Ruby调用shell脚本总结

Ruby可以使用以下几种方法来执行shell脚本。1、使用反引号``调用shell脚本语法`cmd` 返回命令的结果示例`echo "hello"` 2、内置语法%x( cmd ) 其中%x后面为分隔符,上面使用了(作为分隔符,当遇到收括号即表示命令结束。这些分隔符可以为[,{等。示例%x( echo 'hello' 

Python避免使用“is”操作符比较integer数据

Python的is操作符实际上是比较的是对象的id值,id(obj)。a is b 实际可以理解为id(a) == id(b) Python里保存了一个整型数组作为缓存,范围为-5到256,如果使用此范围的数据赋值,那么实际使用引用此数组的数据,所以获取这些范围数据的id值,同一个数是相同的。Python3.6>>>a=-5 >>

Python3.4 枚举类型的使用

枚举类型是在Python3.4新增到Python的标准库。创建枚举Python提供了两种方法来创建枚举:基于class语法创建枚举基于Function API创建枚举创建枚举首先要导入Enum类>>> from enum import Enum 基于class语法创建枚举示例>>> from