我有以下Python脚本:
import sys
print("Output from Python")
print("First name: " + sys.argv[1])
print("Last name: " + sys.argv[2])
我正在尝试从Node.js服务器调用此脚本,并且我已经在线阅读了两种方法:
第一个是使用PythonShell:
const app = require('express')();
const ps = require('python-shell');
ps.PythonShell.run('hello.py', null, function (err, results) {
if (err) throw err;
console.log('finished');
console.log(results);
});
app.listen(4000);
尝试以这种方式实现它时,出现以下错误:
PythonShell.run is not a function
。
我不确定在这里写的路径是否正确,但是我确定在服务器中写的路径是正确的。
第二种方法是使用child process:
var express = require('express');
var app = express();
app.listen(3000, function() {
console.log('server running on port 3000');
} )
app.get('/name', callName);
function callName(req, res) {
var spawn = require("child_process").spawn;
var process = spawn('python',["./hello.py",
req.query.firstname,
req.query.lastname] );
process.stdout.on('data', function(data) {
res.send(data.toString());
} )
}
以这种方式尝试时,出现以下错误:
错误:在Process.ChildProcess._handle.onexit上生成python ENOENT (internal / child_process.js:246:19)在onErrorNT (internal / child_process.js:421:16)在process.internalTickCallback (内部/进程/next_tick.js:72:19)在以下位置发出了“错误”事件: Process.ChildProcess._handle.onexit(内部/child_process.js:252:12) 在onErrorNT(internal / child_process.js:421:16)在 process.internalTickCallback(internal / process / next_tick.js:72:19)
有人知道问题出在哪里吗?还是建议其他选择?
答案 0 :(得分:0)
看起来您提到的答案已经过时了。
尝试一下:
const app = require('express')();
const {PythonShell} = require('python-shell');
PythonShell.run('hello.py', null, function (err, results) {
if (err) throw err;
console.log('finished');
console.log(results);
});
app.listen(4000);
您的第二次尝试在几个地方是错误的。 您可以尝试这种方式:
const express = require('express');
const app = express();
const spawn = require("child_process").spawn;
app.listen(3000, () => {
console.log('server running on port 3000');
} );
app.get('/name', (req, res) => {
const firstName = req.query['firstname'],
lastName = req.query['lastname'];
if (!firstName || !lastName) {
res.status(401).send('missing-fields')
}
const process = spawn('python',["./hello.py", firstName, lastName] );
let result = '';
process.stdout.on('data', data => {
result += data.toString();
} );
process.on('close', code => {
res.send(result);
})
} );
答案 1 :(得分:0)
我认为这可能对您的第一种方法有所帮助:
const app = require('express')();
const ps = require('python-shell');
let options = {
mode: 'text',
pythonPath: '/usr/bin/python',
pythonOptions: ['-u'], // get print results in real-time
scriptPath: '/Users/apple/Desktop/xp',
args: ['value1', 'value2']
};
ps.PythonShell.run('hello.py', options, function (err, results) {
if (err) throw err;
console.log('finished');
console.log(results);
});
app.listen(4000);
第二种方法代码运行正常,没有错误:
运行:node script.js
它将运行服务器,然后在浏览器上的网址下方打开