gpt4 book ai didi

python - 如何在运行的 python 代码和 nodejs 之间进行通信

转载 作者:IT老高 更新时间:2023-10-28 23:16:17 24 4
gpt4 key购买 nike

我想让一些 python 代码运行并与 nodejs express 服务器通信。到目前为止,我可以让我的 nodejs 服务器通过两种机制之一调用 python 函数,或者生成 python 任务,或者让它与 zerorpc python 服务器对话。

对于第一个,拉 http://www.sohamkamani.com/blog/2015/08/21/python-nodejs-comm/ ,这行得通:

var express = require( "express" );
var http = require( "http" );
var app = express();
var server = http.createServer( app ).listen( 3000 );
var io = require( "socket.io" )( server );

app.use( express.static( "./public" ) );

io.on( "connection", function( socket ) {

// Repeat interval is in milliseconds
setInterval( function() {

var spawn = require( 'child_process' ).spawn,
py = spawn( 'python', [ 'mytime.py' ] ),
message = '';

py.stdout.on( 'data', function( data ) {
message += data.toString();
});

py.stdout.on( 'end', function() {
socket.emit( "message", message );
});

}, 50 );
});

mytime.py 在哪里

from datetime import datetime
import sys

def main():
now = datetime.now()
sys.stdout.write( now.strftime( "%-d %b %Y %H:%M:%S.%f" ) )

与 zerorpc http://www.zerorpc.io/ ,如果这个python代码正在运行:

from datetime import datetime
import sys
import zerorpc

class MyTime( object ):
def gettime( self ):
now = datetime.now()
return now.strftime( "%-d %b %Y %H:%M:%S.%f" )

s = zerorpc.Server( MyTime() )
s.bind( "tcp://0.0.0.0:4242" )
s.run()

此 nodejs 代码有效:

var express = require( "express" );
var http = require( "http" );
var app = express();
var server = http.createServer( app ).listen( 3000 );
var io = require( "socket.io" )( server );
var zerorpc = require( "zerorpc" );
var client = new zerorpc.Client();
client.connect( "tcp://127.0.0.1:4242" );

app.use( express.static( "./public" ) );

io.on( "connection", function( socket ) {

// Repeat interval is in milliseconds
setInterval( function() {

client.invoke( "gettime", function( error, res, more ) {
socket.emit( "message", res.toString( 'utf8' ) );
} );

}, 50 );
});

但我想做的不仅仅是调用 python 函数,我想要一个单独的 python 进程运行并向 nodejs 服务器发送消息,该服务器监听它们然后处理它们。我已经尝试过中间件 socketio-wildcard,但是如果我尝试在与 nodejs express 服务器相同的端口上设置一个带有 zerorpc 的 python 服务器,它会给出一个 zmq.error.ZMQError: Address already in use 错误。

我知道我并没有考虑到这一点——我知道由于我在这里的天真,我错过了一些关于进程间通信的逻辑——所以如果有更好的方法来从 python 进程发送消息有一个 nodejs 服务器在监听,我全神贯注。

有什么想法吗?

非常感谢!

最佳答案

对于那些试图解决这个问题的人,这里有一个解决方案,感谢 Zeke Alexandre Nierenberg

对于 node.js 服务器代码:

var express = require( "express" );
var app = express();
var http = require( "http" );
app.use( express.static( "./public" ) ); // where the web page code goes
var http_server = http.createServer( app ).listen( 3000 );
var http_io = require( "socket.io" )( http_server );

http_io.on( "connection", function( httpsocket ) {
httpsocket.on( 'python-message', function( fromPython ) {
httpsocket.broadcast.emit( 'message', fromPython );
});
});

以及发送消息的python代码:

from datetime import datetime
from socketIO_client import SocketIO, LoggingNamespace
import sys

while True:
with SocketIO( 'localhost', 3000, LoggingNamespace ) as socketIO:
now = datetime.now()
socketIO.emit( 'python-message', now.strftime( "%-d %b %Y %H:%M:%S.%f" ) )
socketIO.wait( seconds=1 )

瞧!

关于python - 如何在运行的 python 代码和 nodejs 之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45247118/

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