Вызов функции python из node.js - PullRequest
0 голосов
/ 01 мая 2018

Я хотел бы вызывать функции python из node.js. Я нашел python-shell . Но, насколько я понимаю, он может запустить только полный сценарий Python.

У меня есть логика (загрузка огромного файла), которая занимает около 2 минут. Я хотел бы запустить его, а затем вызвать функции python из узла, чтобы файл загружался только один раз.

# load a huge file takes 2min
model = xyz.load(path)

# function using that model
def doSomething(id):
    # some logic using the model
    return model.get(id)

Как я могу повторно звонить doSomething(), не загружая файл каждый раз?

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Используйте некоторое промежуточное программное обеспечение, например ZeroMQ. Это в основном сокеты, сделанные легко (отправляемая атомная единица - это целое сообщение , а не пакет). Он доступен как для node.js , так и для python .

Типичный клиент / сервер REQ / REP имеет длину всего несколько строк.

Например: сервер Python:

import time
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    #  Wait for next request from client
    message = socket.recv()
    print("Received request: %s" % message)

    #  Do some 'work'
    time.sleep(1)

    #  Send reply back to client
    socket.send(b"World")

и клиент node.js:

var zmq = require('zmq');

// socket to talk to server
console.log("Connecting to hello world server…");
var requester = zmq.socket('req');

var x = 0;
requester.on("message", function(reply) {
  console.log("Received reply", x, ": [", reply.toString(), ']');
  x += 1;
  if (x === 10) {
    requester.close();
    process.exit(0);
  }
});

requester.connect("tcp://localhost:5555");

for (var i = 0; i < 10; i++) {
  console.log("Sending request", i, '…');
  requester.send("Hello");
}

process.on('SIGINT', function() {
  requester.close();
});
0 голосов
/ 09 мая 2018

Оказывается, есть решение этой проблемы с использованием python-shell. Подробности можно найти здесь .

0 голосов
/ 01 мая 2018

Теоретически возможно загрузить интерпретатор Python в другой процесс и затем взаимодействовать с ним, но это не легко, если для него уже нет пакета. Вы, наверное, уже проверяли это.

Если это вообще возможно, заранее выясните все, что вам нужно сделать в Python, передайте список сценарию и верните результаты в виде списка обратно в Node.js. Таким образом, вам нужно всего лишь запустить скрипт один раз.

Если это невозможно, вы можете запустить ваш скрипт на Python как отдельный процесс и заставить программу Node.js взаимодействовать с ним по некоторому протоколу, возможно, так же просто, как JSON через stdin / stdout. Затем ваша программа Node.js может отправлять команды в программу Python, а программа Python может ответить с результатами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...