返回

如何与正在运行的 Python 进程交互?

Linux

与 Python 进程进行交互

问题概述

在进行自动化任务或与其他应用程序协作时,你需要与正在运行的 Python 进程进行交互,提供输入,接收输出,并根据响应动态调整你的脚本。

解决方案:管道通信

使用 Python 的 subprocess 模块,你可以创建管道,在父进程(你的脚本)和子进程(Python 脚本)之间建立通信通道。

步骤:

1. 创建管道

  • 使用 subprocess.Popen() 创建一个管道,指定脚本路径、标准输入 (stdin) 和标准输出 (stdout) 流为管道。

2. 与进程交互

  • 使用 communicate() 方法将数据写入子进程的 stdin 并读取 stdout 的输出。
  • stdin.write() 发送输入,stdin.flush() 刷新缓冲区,stdout.read() 读取输出。

3. 循环交互

  • 在循环中进行交互,直到收到所需的输出或子进程退出。
  • 根据输出采取相应操作,例如跳出循环。

示例脚本:

import subprocess

pipe = subprocess.Popen(["./my_script.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

while True:
    pipe.stdin.write(b"1\n")
    pipe.stdin.flush()

    output = pipe.stdout.read()
    print(output.decode("utf-8"))

    if "You win" in output:
        break

pipe.stdin.close()
pipe.stdout.close()

注意事项:

  • 确保 Python 进程遵循相同的协议,从 stdin 读取并向 stdout 输出。
  • 使用适当的编码解码输出。
  • 使用管道时要注意死锁和阻塞的风险。

常见问题解答

1. 如何在 Windows 上使用管道?

  • Windows 使用不同的底层 API,因此语法略有不同。查看 subprocess 文档以获取具体细节。

2. 如何处理异常?

  • 使用 tryexcept 语句捕获并处理 subprocess 异常,例如 CalledProcessError

3. 如何在子进程中传递参数?

  • 将参数作为 Popen() 调用的一部分传递,例如 ["./script.py", "arg1", "arg2"]

4. 如何从子进程获取返回码?

  • 使用 returncode 属性访问子进程的返回码。

5. 如何终止子进程?

  • 使用 terminate() 方法或 kill() 方法终止子进程。