Python通过不同的模块和库提供了许多功能。当我们需要在Python应用程序中打开一个新进程时,我们可以使用 subprocess
图书馆及相关职能部门。
导入子流程模块
为了使用相关函数和库,我们应该导入 subprocess
图书馆。
import subprocess
使用call()函数启动子进程
创建子流程的simples用例使用 call()
功能。 call()
函数接受相关的二进制或可执行文件名和参数作为Python列表。在这个例子中,我们称之为Linux ls
命令 -l
和 -a
参数。
subprocess.call(['ls','-l','-a'])

为进程创建自己的Shell
在创建新进程时,新创建的进程将使用当前的pythonshell和相关变量。我们可以指定 shell=True
就像下面一样。
subprocess.call(['ls','-l','-a'],shell=True)

保存进程输出(stdout)
在运行给定的命令或二进制文件之后,可能会创建一些输出。默认情况下,这个输出被打印到stdout,对于我们的示例,stdout是Python shell。我们可以通过调用 check_output
命令如下。在本例中,我们将保存。
output=subprocess.check_output(['ls','-l','-a'])

我们可以看到,所有创建的输出都保存到名为 output
. 当我们尝试将这个变量内容打印到终端时,我们将看到确切的run命令输出,即包含用户、所有者和访问时间信息的文件列表。
将输出转换为字符串而不是字节数组
在前面的示例中,我们已经看到输出不是格式化状态,因为输出以字节数组的形式保存到 output
变量。我们将使用 universal_newlines
选项为true for check_output()
功能。
output=subprocess.check_output(['ls','-l','-a'],universal_newlines=True)

从进程获取数据
我们可以通过打开进程来与进程通信 Popen()
功能。我们将创建的流程实例设置为一个变量,然后使用 communicate()
读取工艺管道的函数。在这个例子中,我们将 hello poftut
与 echo
命令插入管道,然后用 communicate()
p = subprocess.Popen(["echo", "hello poftut"], stdout=subprocess.PIPE)print(p.communicate())

如果启动的进程有错误,则引发异常
在使用 call()
函数我们可能会得到一些与提供的命令相关的错误。错误将像Python的常规输出一样打印到屏幕上。

这可能会被误解为命令成功完成且没有错误,因此输出会打印到屏幕上。如果我们想创建一些关于命令错误的监视程序,我们可以使用 check
选项,该选项将在命令出错时引发异常。
subprocess.call(["ls","foo bar"],check=True)
