Связь между NodeJS и Python: передача нескольких аргументов

1

На данный момент я использую встроенный child_process для запуска сценария Python и прослушивания любых данных, переданных обратно через stdout.on('data', (data)), как в строке 6 первого JS-кода. Но из поисковых запросов Google, которые я выполнил, я вижу только примеры того, что передается одна вещь, или группа вещей, передаваемых обратно, все сгруппированы вместе. Мне было интересно, можно ли отправить больше, чем просто один аргумент. Ниже мой код:

JS:

const spawn = require('child_process').spawn;
pythonProcess = spawn('python', ["/path/to/python/file"]);

pythonProcess.stdout.on('data', (data) => {
    console.log(data);
});

Python:

import sys

var thing1 = "Cold";
var thing2 = "Hot";
var thing3 = "Warm";

print(thing1);
print(thing2);
print(thing3);
sys.stdout.flush();

Но то, что я хочу, может быть, это передать что-то вроде массива, заполненного вещами, которые я хочу отправить обратно, чтобы я мог получить к ним доступ в JS файле следующим образом:

const spawn = require('child_process').spawn;
pythonProcess = spawn('python', ["/path/to/python/file"]);

pythonProcess.stdout.on('data', (data) => {
    thing1 = data[0];
    thing2 = data[1];
    thing3 = data[2];
})

console.log('thing1: ' + thing1);
console.log('thing2: ' + thing2);
console.log('thing3: ' + thing3);

Что будет выводить:

thing1: Hot
thing2: Cold
thing3: Warm

Как мне это сделать?

Заранее спасибо!

  • 0
    То, что вы там написали, не Python.
  • 0
    Если вы просто отправляете вещи через стандартный вывод, вам нужно решить, какой формат данных вы хотите использовать. Если это просто строки, которые сами по себе не содержат запятых, то они могут быть просто разделенными запятыми строками, и тогда принимающая сторона должна анализировать их по мере их поступления. Если это всего лишь одна порция данных, то вы можете отправить JSON в заранее заданном формате, в котором вы можете использовать библиотечные функции для создания и анализа на обоих концах.
Показать ещё 2 комментария
Теги:
python-3.x
child-process

1 ответ

2

Не существует интерфейса, который напрямую связывается между Node.js и Python, поэтому вы не можете передавать настраиваемые аргументы, то, что вы делаете, это просто выполнение программы python с использованием child_process, поэтому вы не отправляете аргументы, все, что есть получил на 'data' его то, что напечатано в stdout из python.

Итак, что вам нужно сделать, это сериализовать данные, а затем десериализовать его в узле, вы можете использовать JSON для этого.

Из вашего сценария python выведите следующий объект JSON:

{
   "thing1": "Hot",
   "thing2": "Cold",
   "thing3": "Warm"
}

И в вашем сценарии Node.js:

const spawn = require('child_process').spawn;
const pythonProcess = spawn('python', ["/path/to/python/file"]);

const chunks = [];

pythonProcess.stdout.on('data', chunk => chunks.push(chunk));

pythonProcess.stdout.on('end', () => {

    try {
        // If JSON handle the data
        const data = JSON.parse(Buffer.concat(chunks).toString());

        console.log(data);
        // {
        //    "thing1": "Hot",
        //    "thing2": "Cold",
        //    "thing3": "Warm"
        // }

    } catch (e) {
        // Handle the error
        console.log(result);
    }
});

Имейте в виду, что data фрагментированы, поэтому придется дождаться end события до разбора JSON, иначе будет активирован SyntaxError. (Отправка JSON из Python в узел через child_process усекается, если слишком долго, как исправить?)

Вы можете использовать любой тип сериализации, в котором вы чувствуете себя комфортно, JSON является самым легким, поскольку мы находимся в javascript.


Обратите внимание, что stdout - это поток, поэтому он асинхронный, поэтому ваш пример никогда не будет работать.

pythonProcess.stdout.on('data', (data) => {
    thing1 = data[0];
    thing2 = data[1];
    thing3 = data[2];
})

// Things do not exist here yet
console.log('thing1: ' + thing1);
console.log('thing2: ' + thing2);
console.log('thing3: ' + thing3);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню