【问题标题】:Wrong Python version when ran as a child process in Node.js?在 Node.js 中作为子进程运行时 Python 版本错误?
【发布时间】:2020-02-12 21:49:33
【问题描述】:

目前我正在尝试运行一个响应一串 HTML 代码的 Python 脚本,并且我正在通过 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 2 中运行 Python 脚本,如apparently the newline parameter wasn't added until Python 3。当我自己运行 Python 脚本时,它工作得非常好。我将如何让服务器专门在 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' ]
}

关于我现在应该做什么有什么想法吗?

【问题讨论】:

  • 成功执行代码后如何设置 Python 环境?除非您设置 Python 环境,否则它将采用默认设置。如果你在终端中执行python --version,你会得到什么?单独执行代码会得到什么?

标签: python node.js python-3.x child-process


【解决方案1】:

这是从其他脚本调用 Python 时的一个典型问题,通常是因为从终端运行时所沉浸的默认环境与从程序或脚本中调用可执行文件时所呈现的环境不同.因此替换:

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

与:

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

(换句话说 - 指定所需的确切 Python3 可执行文件的完整路径,而不是在运行时依赖本机环境)。

【讨论】:

  • 我编辑了帖子以显示我这样做时会发生什么。过去的任何想法?谢谢。
  • 请显示您实际使用的完整路径 - 您的错误提示它是“C:UsersNAMEAppDataLocalProgramsPythonPython38python.exe”,这听起来不像是输入正确。
  • 非常感谢。当我复制路径时,它以“path1\path2\path3”的形式出现,所以它读作“path1path2path3”。我只是用 /'s 替换了 \'s,所以它工作得很好。非常感谢。跨度>
  • 超级!如果有帮助,您介意将其标记为正确答案并点赞吗?
猜你喜欢
  • 2015-08-19
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2020-10-17
相关资源
最近更新 更多