[英]how to run a python script from node js
我在 node.js 在树莓派上写了一个服务器。 我想从中运行一个 python 脚本,但它不执行该行。 在以前的实例中,我已经运行文件,但来到 socket.io 的这个实例时,我无法运行该文件。 虽然控制台显示从客户端传递给它的准确 output,但它无法读取文件。 插座负责运动。
/*jshint esversion: 6 */
var express = require('express');
// library for executing system calls
const spawn = require('child_process').spawn;
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
app = express();
server = require('http').createServer(app);
io = require('socket.io').listen(server);
var colour = require('colors');
var ip = require('ip');
var PortNumber = 3000;
var xPos = 0, yPos = 0;
server.listen(PortNumber);
app.use(express.static('public'));
io.sockets.on('connection', function (socket) {
socket.emit('ip', {value: 'http://' + ip.address() + ':8081'});
// otp generation socket
socket.on('userEmail', function (data) {
var userEmail = data.value;
// system call to generate OTP
const OTPgeneration = spawn('python', [__dirname + '/python/OTPgeneration.py', userEmail]);
OTPgeneration.stdout.on('data', (data) => {
console.log(`${data}`);
});
});
// otp submit button socket
socket.on('userOtp', function (data) {
var userOtp = data.value;
console.log(userOtp);
// system call to generate OTP
const otpValidate = spawn('python', [__dirname + '/python/OTPvalidation.py', userOtp]);
otpValidate.stdout.on('data', (data) => {
console.log(`${data}`);
// Get last output from python file
var lastChar = `${data}`.slice(-2);
if (lastChar === '0\n') {
console.log('Wrong OTP');
}
else io.sockets.emit('otpConformation', {value: 'confirm'}); //sends the confirmation to all connected clients
});
});
// x y values socket
socket.on('servoPosition', function (data) {
servoPosition = data.value;
// servoPosition[0] is x and servoPosition[1] is y
console.log('Reveived X: ' + servoPosition[0] + ' Y: ' + servoPosition[1]);
// system call for i2c comminication
const i2cData = spawn('python', [__dirname + '/python/sendI2C.py', servoPosition[0], servoPosition[1]]);
i2cData.stdout.on('data', (data) => {
console.log(`${data}`);
});
});
// movement socket
socket.on('movement', function (data) {
var m = data.value;
console.log("Movement :" + m);
const submitMove = spawn('python', [__dirname + '/python/move.py', m]);
submitMove.stdout.on('data', (data) => {
console.log(`${data}`);
});
});
});
console.log('Server Running @'.green + ip.address().green + ":3000".green);
function readTextFile(file) {
var rawFile = new XMLHttpRequest();
//var rawFile = new XMLHttpRequest();
rawFile.open("GET", file, false);
rawFile.onreadystatechange = function () {
if(rawFile.readyState === 4) {
if(rawFile.status === 200 || rawFile.status === 0) {
allText = rawFile.responseText;
//alert(allText);
}
}
};
rawFile.send(null);
}
尽管使用Node的本机“ child_process”模块是性能最高的选项,但使其工作起来可能很乏味。 一种快速的解决方案是使用node-cmd
模块。 运行npm i node-cmd --save
进行安装。 通过var cmd = require('node-cmd');
导入 在服务器文件的顶部。 然后,
var pyProcess = cmd.get('python YOURPYTHONSCRIPT.py',
function(data, err, stderr) {
if (!err) {
console.log("data from python script " + data)
} else {
console.log("python script cmd error: " + err)
}
}
);
根据需要进行编辑。 node-cmd
有2个调用它的方法get
和run
。 run
只是运行提供的CLI命令,而get
提供了使用回调的方法,从而可以更好地处理错误,并使在stdin
, stdout
和stderr
之间的工作变得更加容易。
考虑使用 package 而不是自己处理生成过程。 你可以在 npm -native-python上查看这个 package
它提供了一种非常简单而强大的方法来从节点运行 python 函数可能会解决您的问题。
import { runFunction } from '@guydev/native-python'
const example = async () => {
const input = [1,[1,2,3],{'foo':'bar'}]
const { error, data } = await runFunction('/path/to/file.py','hello_world', '/path/to/python', input)
// error will be null if no error occured.
if (error) {
console.log('Error: ', error)
}
else {
console.log('Success: ', data)
// prints data or null if function has no return value
}
}
python模块
# module: file.py
def hello_world(a,b,c):
print( type(a), a)
# <class 'int'>, 1
print(type(b),b)
# <class 'list'>, [1,2,3]
print(type(c),c)
# <class 'dict'>, {'foo':'bar'}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.