Combining node.js and Python

后端 未结 7 1807
迷失自我
迷失自我 2020-11-30 16:06

Node.js is a perfect match for our web project, but there are few computational tasks for which we would prefer Python. We also already have a Python code for them. We are h

7条回答
  •  离开以前
    2020-11-30 16:43

    This sounds like a scenario where zeroMQ would be a good fit. It's a messaging framework that's similar to using TCP or Unix sockets, but it's much more robust (http://zguide.zeromq.org/py:all)

    There's a library that uses zeroMQ to provide a RPC framework that works pretty well. It's called zeroRPC (http://www.zerorpc.io/). Here's the hello world.

    Python "Hello x" server:

    import zerorpc
    
    class HelloRPC(object):
        '''pass the method a name, it replies "Hello name!"'''
        def hello(self, name):
            return "Hello, {0}!".format(name)
    
    def main():
        s = zerorpc.Server(HelloRPC())
        s.bind("tcp://*:4242")
        s.run()
    
    if __name__ == "__main__" : main()
    

    And the node.js client:

    var zerorpc = require("zerorpc");
    
    var client = new zerorpc.Client();
    client.connect("tcp://127.0.0.1:4242");
    //calls the method on the python object
    client.invoke("hello", "World", function(error, reply, streaming) {
        if(error){
            console.log("ERROR: ", error);
        }
        console.log(reply);
    });
    

    Or vice-versa, node.js server:

    var zerorpc = require("zerorpc");
    
    var server = new zerorpc.Server({
        hello: function(name, reply) {
            reply(null, "Hello, " + name, false);
        }
    });
    
    server.bind("tcp://0.0.0.0:4242");
    

    And the python client

    import zerorpc, sys
    
    c = zerorpc.Client()
    c.connect("tcp://127.0.0.1:4242")
    name = sys.argv[1] if len(sys.argv) > 1 else "dude"
    print c.hello(name)
    

提交回复
热议问题