Node.JS, порождающий процесс Python, выдает ошибку «JSONDecodeError («Ожидается значение», s, err.value) from None»

Я пытаюсь создать процесс Python (App.py) из файла node.js (index.js).

Скрипт index.js порождает скрипт python App.py и передает ему аргумент params (объект json). Затем App.py считывает элемент uParamsparameter1 и отправляет значение в виде сообщения обратно в index.js.

Однако, когда я запускаю скрипт index.js, я получаю сообщение об ошибке JSONDecodeError("Expecting value", s, err.value) from None.

Я пытался заменить json.loads(sys.argv[1]) на sys.argv[1], но при запуске выдает ошибку TypeError: string indices must be integers.

Я неправильно отформатировал JSON-объект params в index.js?

Не могли бы вы помочь мне определить проблему?

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

index.js:


const spawn = require("child_process").spawn;

let params = {
  "type":"numbers",
  "lang":"js",
  "uParams":[{
    "parameter1":1,
    "parameter2":2,
    "parameter3":3
    }]  
}

const pythonProcess = spawn('python',['./App.py', params]);

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

App.py:


import sys, json

params = json.loads(sys.argv[1])

print(params['uParams'][0]['parameter1'])
sys.stdout.flush()

🤔 А знаете ли вы, что...
JavaScript активно развивается, и новые версии языка регулярно включают новые функции и улучшения.


26
1

Ответ:

Решено

Вы должны преобразовать свой объект JSON в строку с помощью JSON.stringify.

const pythonProcess = spawn('python',['./App.py', JSON.stringify(params)]);

Честно говоря, я удивлен, что spawn не жалуется, что принимает только строковые аргументы, но он должен вызывать toString для вашего объекта, поэтому вы просто передаете [object Object].

> ({foo:'bar'}).toString()
'[object Object]'