You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何启动后台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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:53:07