如何在Python子进程执行中从进程中获取返回代码?

151 阅读4分钟

进程是一个正在运行的程序的名称。内存、文件列表和考虑到正在执行的指令的程序计数器,以及保留局部变量的调用栈都是每个进程的系统状态的一部分。一个进程通常在一个被称为进程主线程的单一指令流序列中一个接一个地处理语句。程序在任何特定时刻都只做一件事。我们的计算机总是在运行子进程。 我们在计算机上的每一个动作都需要激活一个子进程。即使我们正在用Python构建一个基本的 "hello world "程序。即使你已经有一段时间的编程经验,你也可能不知道子进程的概念。本文将介绍子进程的原理,以及如何使用 Python 子进程标准库。

常用的模块有os.fork()、subprocess.Popen()和其他模块。另一方面,子进程作为完全独立的实体运行,每个进程都有自己独特的系统状态和运行的主线程。你可以使用 Python 的 Subprocess 模块来构造新的进程。之后,它可以连接到正常的输入/输出/错误流,并获得一个返回代码。例如,一个子进程可以从一个脚本中运行任何Linux命令。根据不同的情况,要么检索结果,要么简单地验证操作是否被适当地执行。请注意,子进程模块的语法在 Python 3.5 中有所改变。

例1:

在第一个例子中,你可以了解如何从一个进程中获得一个返回代码。代码显示,我们首先导入了子进程模块。之后,我们调用了 Popen 方法。返回值本质上是一个管道连接的开放文件对象。根据w和r模式的不同,它可以被写入或读取。"r "是默认模式。一些程序使用的bufsize参数与内置open()函数的类似参数几乎相同。不同的是,当退出状态为0时,在这种情况下会返回None,命令的退出状态可以作为文件对象close()方法的返回结果。我们想接收命令的输出,所以我们使用stdout参数,其值为subprocess。在导入子进程后的第二行代码中使用了PIPE,你可以看到。

import subprocess
p = subprocess.Popen(["echo", "Welcome"], stdout=subprocess.PIPE)
print (p.returncode)

上面的代码给出了下面的输出。

例2:

使用完communication后,我们将教你如何获取子进程的返回代码。communicate()方法本质上是写输入,读所有输出,并等待子进程退出(本例中没有输入,所以它只是关闭子进程的stdin以表示没有输入了)。

import subprocess
p = subprocess.Popen(["echo", "Welcome"], stdout=subprocess.PIPE)
print (p.communicate()[0])

这就是上述代码的输出结果。

例3:

在这个例子程序中,我们要使用保存进程输出。使用save process output函数,将代码的输出保存在一个字符串中。这个方法的语法如下。

Python中子进程的stdout方法需要几个参数:args:这是你要运行的命令。多个命令可以通过使用分号 (;) 分隔它们来传递。作为(os.pipe())给标准输入流的值,被称为stdin。获得的标准输出流的值是stdout。任何来自标准错误流的错误都由stderr来处理。如果为真,shell布尔参数导致进程在一个新的shell中运行。通用换行是一个布尔参数,当其值为真时,它用stdout和stderr打开文件。
import subprocess.

p = subprocess.check_output(["echo", "Phython is easy to learn!"])
print(p)

结果可以在这里看到。

总结

你在这篇文章中了解了Python中的子进程以及如何从一个进程中提取返回代码。通过加入子进程模块,你可以很容易地从你的Python代码中直接运行外部进程。Popen、communication和returncode方法是本文中最重要的函数。Python技术popen()建立了与一个命令的连接或从一个命令的连接。

bufsize参数等同于open()函数的size参数。communicate()方法有效地写入输入,收集所有输出,并等待子进程退出。returncode()函数给出所执行命令指定的返回代码。该命令在自己的进程中运行,不需要用户的任何输入。在我们提供的例子中,我们已经解释了这些方法。一旦你练习并学会了如何正确利用这些函数,你在Python中生成子进程并与之通信就不会有太大问题。