gpt4 book ai didi

python - 使用 python-shell 持续交换数据

转载 作者:搜寻专家 更新时间:2023-10-31 23:23:14 25 4
gpt4 key购买 nike

我需要从 Node 运行一些 python 脚本。由于我的 python 脚本使用复杂的结构,我认为如果我只加载这些结构一次然后使用这些结构运行一些特定的脚本(任务)会更好。

在 Node 上我想永远运行一个脚本(或者直到我说它可以终止)并继续向这个脚本发送按需消息。此脚本将使用 python multiprocessing 创建一个进程来运行特定任务并再次开始监听。

一个用例是:

  • Node 启动,并唤醒python脚本
  • Node 客户端上的一些操作导致它向 python 脚本发送一个命令
  • python 脚本计算它需要的内容并返回数据

我认为 python-shell 可以帮我解决这个问题

在 Node 上我有这样的东西:

var app = express();
app.listen(8000, function () {
console.log('Example app listening on port 8000!');
});

var pyshell = new PythonShell('start.py', options);
pyshell.on('message', function (message) {
handleAnswer(message);
});

pyshell.end(function (err, code, signal) {
handleEnd(err, code, signal);
});

app.get('/hello', function (req, res) {
pyshell.send('hello');
});

我的 start.py 脚本是:

import sys

def listen():
while True:
command = sys.stdin.readline()
command = command.split('\n')[0]
if command:
print("Received CMD " + command)

if __name__ == '__main__':
data = json.loads(sys.argv[1])
listen()

我尝试了关于这个 similar question 的解决方案但是在端点中包装 hello 消息时出现错误。

我正确地需要 python-shell 模块,我能够执行 python 脚本并返回数据(使用 print)。我的问题是启动脚本并在(随机)时间段后发送消息。

当我打开 localhost:8000/hello 时,我得到了 Error: write after end

完整错误:

    Error: write after end
at writeAfterEnd (_stream_writable.js:236:12)
at Socket.Writable.write (_stream_writable.js:287:5)
at Socket.write (net.js:717:40)
at PythonShell.send (C:\Users\leonardo.schettini\Documents\recrutai\client\node_modules\python-shell\index.js:206:16)
at C:\Users\leonardo.schettini\Documents\recrutai\client\app.js:27:12
at Layer.handle [as handle_request] (C:\Users\leonardo.schettini\Documents\recrutai\client\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\leonardo.schettini\Documents\recrutai\client\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\leonardo.schettini\Documents\recrutai\client\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Users\leonardo.schettini\Documents\recrutai\client\node_modules\express\lib\router\layer.js:95:5)
at C:\Users\leonardo.schettini\Documents\recrutai\client\node_modules\express\lib\router\index.js:281:22

最佳答案

好吧,我检查了我为 python-shell 所做的包装器,并在脚本创建后发现了一个 pyshell.end(callback) 调用。

我非常确定 end 只会在 python 脚本完成时执行,但碰巧它会在不终止脚本的情况下关闭输入流。

为我的疏忽道歉。

关于python - 使用 python-shell 持续交换数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50223084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com