如何从node.js调用外部脚本/程序

24
我有一个使用C++编写的程序和一个Python脚本,我想将它们整合到我的node.js网站中。我希望用它们来解析上传到我的网站上的文件;处理可能需要几秒钟时间,因此我想避免阻塞应用程序。请问如何在node.js控制器中接受文件,然后从子进程中运行C++程序和脚本?

1
你的 C++ 程序是被 Python 调用,还是你会分别调用这两个程序?1) 向 Python 发出调用指令,2) 调用 C++ 应用程序? 或者是 Python 代码加载并调用你的 C++ 应用程序? - Steve
Node的child_process可以异步运行进程。如果你只想从Node中启动一个程序,那就可以这样做。 - Joe
@StevenLeggett 这个python脚本和C++应用程序完全不相互作用; 我想分别调用它们(它们也不需要按任何特定的顺序)。 - alh
如果您可以从命令行执行C++应用程序,则我的解决方案应该有效...您可能需要查看async库以帮助控制流程,例如按系列调用Python然后C++。 - Plato
2个回答

40

请查看child_process。以下是使用spawn的示例,它允许您在输出数据时写入标准输入和读取标准错误/标准输出。如果您不需要向标准输入写入并且可以在进程完成时处理所有输出,则child_process.exec提供了一个稍微简短的语法来执行命令。

// with express 3.x
var express = require('express'); 
var app = express();
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(app.router);
app.post('/upload', function(req, res){
   if(req.files.myUpload){
     var python = require('child_process').spawn(
     'python',
     // second argument is array of parameters, e.g.:
     ["/home/me/pythonScript.py"
     , req.files.myUpload.path
     , req.files.myUpload.type]
     );
     var output = "";
     python.stdout.on('data', function(data){ output += data });
     python.on('close', function(code){ 
       if (code !== 0) {  
           return res.send(500, code); 
       }
       return res.send(200, output);
     });
   } else { res.send(500, 'No file found') }
});

require('http').createServer(app).listen(3000, function(){
  console.log('Listening on 3000');
});

这种格式如何处理类型?如果我将0.123作为参数发送,Python会如何处理它,因为我认为它是以字符串形式传入的? - Spencer
1
据我所知,URL组件以及Unix/Windows shell命令始终将所有内容作为字符串使用,因此我认为这是Python应用程序的责任将其转换为数字。在正常的命令行调用中,你会如何告诉Python它是一个数字? - Plato
1
你说得对,这很有道理。我应该再考虑一下哈哈。谢谢! - Spencer
1
@spencer 有一件事可能会有所帮助,那就是让节点应用程序创建一个包含您的数据的JSON对象,这将区分数字和字符串。然后将其发送到Python应用程序的stdin并解析它。 - Plato

1

这可能是一个老问题,但其中一些参考资料将提供更多细节和不同的方法来在NodeJS中包含Python。

有多种方法可以做到这一点。

  • 第一种方法是通过执行npm install python-shell

以下是代码:

var PythonShell = require('python-shell');
//you can use error handling to see if there are any errors
PythonShell.run('my_script.py', options, function (err, results) { 
//your code

您可以使用pyshell.send('hello');向Python Shell发送消息。

您可以在此处找到API参考-https://github.com/extrabacon/python-shell

  • 第二种方法-您可以参考另一个软件包node-python,您需要执行npm install node-python

  • 第三种方法-您可以参考这个问题,在那里您可以找到使用子进程的示例- 如何从node.js调用外部脚本/程序

更多参考资料 - https://www.npmjs.com/package/python

如果您想使用面向服务的架构 - http://ianhinsdale.com/code/2013/12/08/communicating-between-nodejs-and-python/


如果我可以从Node生成一个Python进程,那么这将起作用。我已经运行了一个Node服务器和一个以守护线程模式运行的Python脚本,我想从Node访问Python中的变量,你会怎么做? - PirateApp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接