与服务器上运行的python脚本保持通讯

时间:2020-08-14 14:53:40

标签: python node.js websocket

这是我到目前为止开发的。首先,我的websocket服务器:

// app.js
const spawn = require('child_process');
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 8080 })

wss.on('connection',ws => {
  ws.on('message', message => {
    const python = spawn('python', ['-u', 'main.py', message])
    python.stdout.on('data', function (data) {
      // Pipe data from python script ...
      dataToSend = data.toString('utf8');
      ws.send(dataToSend)
     });
     python.on('error', err => {
       console.log(err)
     })
  })
  ws.on('close', () => {
    console.log('Client has disconected')
  })
}).on('error', err => {
  console.log(err)
})

它的基本用法是使用child_process生成一个Python脚本,该脚本传递从客户端发送的message。 传递-u是为了刷新python脚本打印,因此可以在python.stdout上将其流式传输并发送给客户端。

这是从app.js websocket服务器调用的python脚本:

# main.py
import time, sys
i = int(sys.argv[1])
while i > 0:
    print(i)
    i-=1
    time.sleep(1)
    # this while is just anexemple of some pre-script process
    # (for exemple, signin on user account)

# after signin...
print('input something from client: ')
x = input()

while True:
    print(x)
    time.sleep(1)
    # use input x variable
    # here is where my code happens and the program keeps executing
    pass

如您所见,我正在使用从服务器传递到message的{​​{1}}来保持我的第一个spawn()的生命。只是一个例子,我需要用户的这种输入。

请注意while,因为这是我的主要问题

最后,我的客户网络套接字

x = input()

基本知识会传递第一个参数// client.js const WebSocket = require('ws'); let socket = new WebSocket("ws://localhost:8080"); socket.onopen = function(e) { let someClientInfo = 2 console.log("sending data..."); socket.send(someClientInfo); }; socket.onmessage = function(event) { console.log('Output of python script: ' + event.data.toString('utf-8')); }; socket.onerror = function(event) { console.log(event); }; ,然后接收python脚本输出,如下所示:

someClientInfo

当然,当客户收到最后一行时,由于他无法从他的侧面输入任何东西,它总是会卡住。他只是从python接收输出流。

有人知道是否有可能将第二个输入传递给我正在运行的python脚本吗?我开始认为也许这是不可能的,但是我不能以另一种方式做到这一点。如果sending data... Output of python script: 2 Output of python script: 1 Output of python script: input something from client: 无法做到,那我应该寻找什么方式?

我的主要目的是与服务器上运行的python脚本保持实时通信,因此我可以将此输入从客户端传递给python。

我希望能够从此套接字断开连接,然后再次连接并继续接收python脚本输出。到目前为止,我也找不到办法。

我的主脚本不能放在服务器代码中(也许如果您对flask的基本实现有所了解),因为我希望能够启动多个脚本,并且每个客户端用户都应该能够继续在服务器上运行自己的python脚本进行编辑。每个用户都有自己的child_process

到目前为止,我还没有对如何保持所有这些进程在服务器上运行,甚至可以安全地进行这样的事情保持坚决态度。关于此的任何建议将非常感激,我也将非常感谢。

1 个答案:

答案 0 :(得分:1)

您可能想签出https://www.npmjs.com/package/python-shell 您可以在node上生成一个python实例。

相关问题