我需要从节点运行一些
python脚本.由于我的
python脚本使用复杂的结构,我认为如果我只加载一次这些结构然后使用结构运行一些特定的脚本(任务)会更好.
在节点上我想永远运行一个脚本(或直到我说它可以终止)并继续向这个脚本发送按需消息.该脚本将使用python多处理创建一个进程来运行特定任务并再次开始侦听.
用例是:
>节点启动,并唤醒python脚本
>节点客户端上的某些操作会导致它向python脚本发送命令
> python脚本计算它需要的内容并返回数据
我认为python-shell可以帮助我解决这个问题
在节点上我有这样的事情:
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
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(回调)调用.
我非常确定只有在python脚本完成时才会执行结束,但它会在没有终止脚本的情况下关闭输入流.
为我缺乏关注而道歉.