Неверная версия Python при запуске как дочерний процесс в Node.js? - PullRequest
0 голосов
/ 13 февраля 2020

В настоящее время я пытаюсь запустить скрипт Python, который отвечает строкой кода HTML, и я запускаю его через Node.js дочерний процесс. Вот код, который я написал для сервера:

const express = require('express');
const app = express();
const PORT = process.env.PORT || 5000;

app.listen(PORT, () => console.log(`Server started on port ${PORT}`));

app.get('/', (req,res) => {
    const spawn = require("child_process").spawn;
    const pythonProcess = spawn('python',["graphing.py"]);
    pythonProcess.stdout.on('data', (data) => {
        console.log("It worked!")
        res.write(data.toString());
        res.end();
    });
    pythonProcess.stderr.on('data', (data) => {
        console.log("ERROR!")
        console.log(data.toString());
        res.write("Error. Check console.");
        res.end();
    });
});

Я попытался запустить этот код с простыми инструкциями печати в Python, и это прекрасно работало. Тем не менее, когда я пытаюсь сделать это с моим правильным сценарием, я получаю эту ошибку:

Traceback (most recent call last):
  File "graphing.py", line 34, in <module>
    print(mpld3Plot("./data/weather/daily/Baka_ThruApr-2019.csv", ('maxTemp','minTemp')))  
  File "graphing.py", line 18, in mpld3Plot
    with open(abs_path, newline='') as csvfile:
TypeError: 'newline' is an invalid keyword argument for this function

После небольшого копания, я совершенно уверен, что эта проблема, потому что сервер работает Python сценарий в Python 2, так как очевидно, что параметр новой строки не был добавлен до Python 3 . Когда я запускаю скрипт Python сам по себе, он прекрасно работает. Как мне go заставить сервер запустить скрипт в Python 3 специально? Спасибо.

Редактировать: Когда я изменяю путь с 'python' на абсолютный путь, я получаю эту ошибку:

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

Error: spawn C:UsersNAMEAppDataLocalProgramsPythonPython38python.exe ENOENT     
    at Process.ChildProcess._handle.onexit (internal/child_process.js:264:19)
    at onErrorNT (internal/child_process.js:456:16)
    at processTicksAndRejections (internal/process/task_queues.js:81:21)
Emitted 'error' event on ChildProcess instance at:
    at Process.ChildProcess._handle.onexit (internal/child_process.js:270:12)
    at onErrorNT (internal/child_process.js:456:16)
    at processTicksAndRejections (internal/process/task_queues.js:81:21) {
  errno: 'ENOENT',
  code: 'ENOENT',
  syscall: 'spawn C:UsersNAMEAppDataLocalProgramsPythonPython38python.exe',     
  path: 'C:UsersNAMEAppDataLocalProgramsPythonPython38python.exe',
  spawnargs: [ 'graphing.py' ]
}

Есть какие-нибудь идеи относительно того, что мне следует делать сейчас?

1 Ответ

0 голосов
/ 13 февраля 2020

Это классическая c проблема при вызове Python из других сценариев, обычно потому, что среда по умолчанию, в которой вы оказались при запуске из терминала, отличается от среды, которая присутствует при вызове исполняемого файла из в рамках программы или сценария. Поэтому замените:

const pythonProcess = spawn('python',["graphing.py"]);

на:

const pythonProcess = spawn('/complete/path/to/python3',["graphing.py"]);

(Другими словами - укажите полный путь к нужному Python3 исполняемому файлу, а не полагайтесь на собственную среду в время выполнения).

...