如何启动后台Shell/Python内核、建立连接并获取执行输出?
如何在Bash中与多个Python进程持续交互
我完全懂你这种明明需求很明确,但搜出来全是Jupyter/IPython相关内容的挫败感!之前我也遇到过类似的场景——要同时控制多个Python进程,能反复发送命令、获取输出,下面分享几个亲测好用的方案:
方案1:Bash协程(Coprocess)+ Python标准IO
你提到已经找到协程的近似方案,其实可以把它和Python的sys.stdin/sys.stdout结合得更紧密,实现完整的双向交互。
先启动一个Python协程进程:
coproc PYPROC1 { python -u -c " import sys while True: cmd = sys.stdin.readline().strip() if not cmd: break # 这里可以替换成你的自定义逻辑,比如调用特定函数 try: result = eval(cmd) print(result) except Exception as e: print(f'Error: {str(e)}') "; }
之后就能反复给它发命令、取输出:
# 发送命令到进程 echo "1+2" >&${PYPROC1[1]} # 读取输出 read -r output <&${PYPROC1[0]} echo $output # 输出3 # 再发一个命令 echo "'hello world'.title()" >&${PYPROC1[1]} read -r output <&${PYPROC1[0]} echo $output # 输出Hello World
要启动多个进程?直接复制上面的代码,把PYPROC1换成PYPROC2/PYPROC3即可。注意加上-u参数关闭Python的输出缓冲,不然可能拿不到实时结果。
方案2:用Python的pexpect库(更灵活的交互控制)
如果觉得Bash层面的控制不够精细,试试用Python自己的pexpect库来管理多个子进程——它专门用来处理交互式程序的输入输出。
先安装pexpect:
pip install pexpect
然后写一个控制脚本:
import pexpect # 启动第一个Python交互进程 proc1 = pexpect.spawn('python -u', encoding='utf-8') proc1.expect('>>> ') # 等待Python的提示符 # 发送命令并获取结果 proc1.sendline('import math; math.pi * 2') proc1.expect('>>> ') print(proc1.before.strip()) # 输出6.283185307179586 # 启动第二个进程 proc2 = pexpect.spawn('python -u', encoding='utf-8') proc2.expect('>>> ') proc2.sendline('len(["a", "b", "c"])') proc2.expect('>>> ') print(proc2.before.strip()) # 输出3 # 后续可以持续给两个进程发命令 proc1.sendline('"test".swapcase()') proc1.expect('>>> ') print(proc1.before.strip()) # 输出'TEST'
这个方案的好处是能在Python代码里处理更复杂的交互逻辑,比如捕获特定输出、处理超时等。
方案3:Socket进程间通信(适合跨场景需求)
如果你的需求更复杂(比如进程在不同机器上,或者需要更稳定的长连接),可以用Socket来实现。
先写一个Python服务端脚本(比如python_server.py):
import socket def process_command(cmd): # 自定义命令处理逻辑,替换成你的需求 try: return str(eval(cmd)) except Exception as e: return f'Error: {str(e)}' server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 12345)) server_socket.listen(1) conn, addr = server_socket.accept() print(f'Connected by {addr}') while True: data = conn.recv(1024).decode('utf-8').strip() if not data: break result = process_command(data) conn.sendall(f'{result}\n'.encode('utf-8')) conn.close()
启动服务端:
python python_server.py
然后在Bash里用nc命令连接并交互:
nc localhost 12345 # 输入1+2,回车后收到3 # 输入math.sqrt(16),回车后收到4.0
要多个进程?只要启动多个不同端口的服务端,分别用nc连接即可。
内容的提问来源于stack exchange,提问作者abalter
相关产品推荐
相关产品推荐

