Python中popen2()函数的进程间通信示例
发布时间:2024-01-01 10:12:33
popen2()函数在Python中已经被弃用,取而代之的是subprocess模块中的Popen类。process模块提供了更多功能,并且更容易使用。下面是一个使用subprocess模块实现进程间通信的示例:
import subprocess
# 父进程使用Popen创建子进程
child_process = subprocess.Popen(["python", "child_process.py"], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
# 父进程通过子进程的stdin向子进程发送数据
input_data = "Hello child process!"
child_process.stdin.write(input_data.encode())
child_process.stdin.close()
# 父进程通过子进程的stdout接收子进程的输出
output_data = child_process.stdout.read()
child_process.stdout.close()
# 等待子进程结束
child_process.wait()
# 打印子进程的输出
print("子进程的输出:", output_data.decode())
上面的代码中,父进程创建一个子进程,子进程执行child_process.py脚本。父进程通过子进程的stdin向子进程发送数据,并通过stdout接收子进程的输出。
下面是child_process.py脚本的示例代码:
import sys # 从父进程的stdin接收数据 input_data = sys.stdin.read() # 处理数据 output_data = input_data.upper() # 将处理结果发送给父进程的stdout sys.stdout.write(output_data)
child_process.py脚本接收来自父进程的数据,将数据转为大写字母,并将结果发送给父进程的stdout。
通过上面的代码,父进程和子进程之间可以实现简单的数据交互。在实际应用中,在子进程中执行复杂的任务,并通过进程间通信与父进程交互,可以提高程序的可扩展性和灵活性。
需要注意的是,Popen类的communicate()方法提供了更方便的接口,用于实现父进程与子进程之间的通信。例如,上面的代码也可以改写为:
import subprocess
# 父进程使用Popen创建子进程
child_process = subprocess.Popen(["python", "child_process.py"], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
# 父进程通过子进程的stdin向子进程发送数据,并接收子进程的输出
input_data = "Hello child process!"
output_data, _ = child_process.communicate(input_data.encode())
# 打印子进程的输出
print("子进程的输出:", output_data.decode())
communicate()方法将自动关闭子进程的stdin和stdout,并等待子进程结束。它返回一个元组, 个元素为子进程的输出,第二个元素为子进程的错误输出。
