На данный момент я использую встроенный 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
Как мне это сделать?
Заранее спасибо!
Не существует интерфейса, который напрямую связывается между 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);