如何使用pexpect实现两个Python脚本间的消息通信?
用pexpect实现两个Python脚本通信的解决方案
问题分析
你的代码无法捕获响应的核心原因:发送消息后未等待子进程(script_2)输出完成就读取内容,导致拿到的是第一次匹配>之前的空内容,而非script_2的回显。
最小可用示例
修正后的script_1.py
# script_1.py import pexpect # 替换为script_2.py的实际路径 child = pexpect.spawn("python /path/to/script/script_2.py") # 等待script_2输出的提示符号">" child.expect(">") # 获取用户输入并发送给script_2 msg = input("Message to the other script: ") child.sendline(msg) # 等待子进程结束(EOF),捕获所有输出 child.expect(pexpect.EOF) # 解码并打印script_2的回显内容 print("Received from script_2:", child.before.decode().strip())
script_2.py(可直接使用)
# script_2.py indata = input(">") print(indata)
运行逻辑
- script_1启动script_2进程,等待其输出提示符号
> - 用户输入消息,script_1发送给script_2
- script_2接收消息并回显,随后进程退出
- script_1捕获script_2的输出并打印
扩展为多次通信场景
如果需要持续交互而非单次通信,可修改脚本实现循环:
扩展版script_2.py
# script_2.py - 支持持续通信 while True: try: indata = input(">") # 自定义回复逻辑,这里以添加前缀为例 print(f"Echo: {indata}") except EOFError: # 子进程关闭时退出循环 break
扩展版script_1.py
# script_1.py - 支持持续通信 import pexpect child = pexpect.spawn("python /path/to/script/script_2.py") while True: # 等待script_2的输入提示 child.expect(">") msg = input("Enter message (type 'exit' to quit): ") if msg.lower() == "exit": child.sendline(msg) child.expect(pexpect.EOF) print("Connection closed.") break child.sendline(msg) # 等待script_2的回复换行,捕获回复内容 child.expect("\n") response = child.before.decode().strip() print(f"Script_2 response: {response}")
内容的提问来源于stack exchange,提问作者Mikkel Rev
相关产品推荐
相关产品推荐

