порождать python ENOENT node.js в окнах

Я создал код для своего брата, который хотел использовать функцию python из его бэкенда node.js. Однако при запуске на моем компьютере с Ubuntu он работает! При запуске кода на его машине с Windows он дает эту трассировку стека.

events.js:174
      throw er; // Unhandled 'error' event
      ^

Error: spawn python ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
    at onErrorNT (internal/child_process.js:415:16)
    at process._tickCallback (internal/process/next_tick.js:63:19)
    at Function.Module.runMain (internal/modules/cjs/loader.js:757:11)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)
Emitted 'error' event at:
    at Process.ChildProcess._handle.onexit (internal/child_process.js:246:12)
    at onErrorNT (internal/child_process.js:415:16)
    [... lines matching original stack trace ...]
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)

Это файл node.js

const spawn = require("child_process").spawn;
const pythonProcess = exec('python',["./script.py", 2, 4]);

pythonProcess.stdout.on('data', function(data) {
    console.log(data.toString('utf-8'))
} )

а это файл script.py

import sys

print("work with me please")
sys.stdout.flush()

Есть масса людей с такими проблемами, однако все ответы кажутся слишком конкретными для конкретного человека. Некоторые упоминают переменные пути, некоторые npm.cmd и другие что-то третье.

Как мне обойти этот конкретный случай?


редактировать:

Я пробовал npm init, npm install, финансировал перемещение фрагментов кода, гуглил, изменял область действия cmd и каталога и так далее.


person Jonas Grønbek    schedule 06.03.2019    source источник
comment
Вы убедились, что вызов python ./script.py работает при вызове из командной строки на компьютере с Windows?   -  person Chase    schedule 07.03.2019
comment
@Чейз, да, сэр!   -  person Jonas Grønbek    schedule 07.03.2019
comment
Это черная дыра, в которую легко попасть, но еще одна очевидная вещь, которую нужно проверить, был ли код Node на машине Windows просто скопирован и запущен или была установлена ​​свежая версия node_modules с npm install? Кросс-ОС и кросс-архитектура обычно означают, что некоторые модули должны быть скомпилированы при установке для системы, в которой они находятся.   -  person Chase    schedule 07.03.2019
comment
@Chase Я должен был добавить это в пост. Да, мы установили npm init, удалили куски кода, вставили обратно и так возились пару часов, прежде чем решили опубликовать этот вопрос. Так нет же, если бы это было так!   -  person Jonas Grønbek    schedule 07.03.2019
comment
@ Чейз, я поступил неправильно. Мы вернулись и переустановили Python, и это сработало. Вы человек часа!   -  person Jonas Grønbek    schedule 07.03.2019
comment
Все хорошо, рад, что заработало.   -  person Chase    schedule 08.03.2019


Ответы (2)


Эй, у меня была похожая проблема, и это помогло, она была исправлена, когда я добавил pythonPath: 'python':

const { PythonShell } = require('python-shell');

let options = {
    mode: 'text',
    pythonPath: 'python',
    pythonOptions: ['-u'], // get print results in real-time
    scriptPath: 'path',
    args: ['arg1', 'arg2']
};

PythonShell.run('scraper.py', options, function(err, results) {
    if (err) console.log(err);
    // results is an array consisting of messages collected during execution
    console.log('results: %j', results);
});
person omn_1    schedule 03.02.2020
comment
Кто-нибудь может объяснить, как работает это изменение? - person Terry Windwalker; 14.06.2021

У меня была аналогичная ошибка:

events.js:292 бросить; // Необработанное событие "ошибка" ^

Ошибка: создать python ENOENT в Process.ChildProcess._handle.onexit (внутренний/child_process.js:267:19) в onErrorNT (внутренний/child_process.js:469:16) в processTicksAndRejections (внутренний/процесс/task_queues.js:84: 21) Создано событие «ошибка» в экземпляре ChildProcess по адресу: в Process.ChildProcess._handle.onexit (внутренний/child_process.js:273:12) в onErrorNT (внутренний/child_process.js:469:16) в processTicksAndRejections (внутренний/процесс /task_queues.js:84:21) { errno: 'ENOENT', код: 'ENOENT', системный вызов: 'spawn python', путь: 'python', spawnargs: ['/home/NodeJsRunPython/script2.py'] }

для этого скрипта адаптировано из https://medium.com/swlh/run-python-script-from-node-js-and-send-data-to-browser-15677fcf199f

Я меняю «python» на «python3» на

const python = spawn('python3', [__dirname +'/script2.py']);

Для меня это работает:

const express = require('express')
const {spawn} = require('child_process');
const app = express()
const port = 3000

app.get('/', (req, res) => {
 
 var dataToSend;
 // spawn new child process to call the python script
 const python = spawn('python', [__dirname +'/script2.py']);
 // collect data from script
  python.stdout.on('data', function (data) {
  console.log('Pipe data from python script ...');
  dataToSend = data.toString();
 });
 // in close event we are sure that stream from child process is closed
 python.on('close', (code) => {
 console.log(`child process close all stdio with code ${code}`);
 // send data to browser
 res.send(dataToSend)
 });
 
})
app.listen(port, () => console.log(`Example app listening on port 
${port}!`))

person Constantin    schedule 25.11.2020