1. 前言
在Python编程中,子进程是一个非常重要的概念。它允许我们启动并行任务,执行外部命令,和在多个CPU核心上运行代码等等。在Python 标准库中,有一个名为subprocess模块,它允许我们在Python中控制新的子进程,以及与这些进程之间进行通信。在本文中,我们将介绍如何使用subprocess模块在Python 3.x中进行子进程管理。
2. 使用subprocess进行基本的进程管理
2.1 subprocess的基本用法
使用 subprocess 来启动一个新的进程是非常简单的。我们只需调用 subprocess.run() 并指定命令,就能启动一个新的进程。例如,下面的代码会创建一个新的进程并执行一个简单的命令:
import subprocess
subprocess.run("ls")
在这个例子中,ls 命令被执行,它会列出当前目录下的所有文件和文件夹。
2.2 使用参数和标志
通常,我们并不会直接运行一个简单的命令。相反,我们会传递参数和标志来实现所需的功能。下面的代码演示了如何在命令中传递参数和标志:
import subprocess
subprocess.run(["ls", "-l"])
在这个例子中,我们使用了一个包含两个元素的列表,列表的第一个元素是命令,第二个元素是一个标志。该命令输出的内容将像ls命令传递了"-l"标志一样,包括更多的详细信息。
2.3 使用stdin、stdout和stderr
当我们与外部进程进行通信时,我们可能需要使用stdin、stdout和stderr。stdin代表标准输入,stdout代表标准输出,stderr代表标准错误。下面的代码演示了如何使用这些流对象来执行一条新的命令:
import subprocess
proc = subprocess.run(["echo", "Hello, world!"], stdout=subprocess.PIPE)
print(proc.stdout.decode())
在这个例子中,我们使用了标准输出来获取命令的输出结果。我们将stdout 参数设置为 subprocess.PIPE,以便 subprocess 捕获命令的输出。然后,我们使用 proc.stdout.decode() 将命令的输出转换为字符串,并打印它。
3. 使用Popen类进行高级进程管理
3.1 使用Popen类
subprocess模块还提供了一个名为Popen 的类,它提供了更多的进程控制选项。下面的代码演示了如何使用 Popen 类来启动一个新的进程:
import subprocess
proc = subprocess.Popen(["ls", "-l"])
proc.wait()
在这个例子中,我们使用 Popen 类来启动一个新的进程并指定命令。我们还调用了 proc.wait() 等待该进程完成。
3.2 在后台运行进程
默认情况下,Popen 类会等待子进程完成后才返回。但我们也可以使用 Popen 类在后台运行进程。在这种情况下,我们不需要等待进程完成,而是可以继续运行我们的Python代码。下面的代码演示了如何在后台运行一个新的进程:
import subprocess
proc = subprocess.Popen(["ls", "-l"])
print("后台进程开始")
# Do other stuff here...
proc.poll()
print("后台进程完成")
在这个例子中,我们创建了一个新的进程并在后台运行它。我们调用了 proc.poll() 来检查进程是否已完成。
3.3 与进程进行交互
Popen 类还允许我们与进程进行交互,并读取或写入stdin、stdout和stderr。下面的代码演示了如何使用Popen类来启动一个新的进程、写入标准输入、读取标准输出,并等待进程完成:
import subprocess
proc = subprocess.Popen(["cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
# Write input to process
proc.stdin.write("Hello, world!\n".encode())
proc.stdin.flush()
# Read output from process
output = proc.stdout.readline().decode()
# Wait for process to complete
proc.wait()
print(output)
在这个例子中,我们创建了一个新的进程 cat 并将 stdin 参数设置为 subprocess.PIPE,这样我们就可以向进程写入输入。然后,我们向进程写入了“Hello, world!”字符串,并调用了 stdin.flush() 以确保所有输入都已发送。接着,我们从进程的 stdout 中读取了一行输出,并将其打印出来。
4. 总结
在本文中,我们介绍了如何使用Python的subprocess模块在Python 3.x中进行子进程管理。我们了解了如何使用基本的subprocess.run()函数来执行命令,如何使用Popen类来控制进程的生命周期,如何使用stdin、stdout和stderr来与进程通信,以及如何在后台运行进程。当您编写需要调用外部命令的Python代码时,这些技巧将非常有用。