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

Posted

技术标签:

【中文标题】如何从 node.js 调用外部脚本/程序【英文标题】:How to invoke external scripts/programs from node.js 【发布时间】:2014-01-07 13:23:56 【问题描述】:

我有一个C++ 程序和一个Python 脚本,我想将它们合并到我的node.js 网络应用程序中。

我想用它们来解析上传到我网站的文件;处理可能需要几秒钟,所以我也会避免阻止该应用程序。

我怎样才能接受该文件,然后在 node.js 控制器的子进程中运行 C++ 程序和脚本?

【问题讨论】:

您的 C++ 程序是从 Python 中调用的,还是您将进行这两个单独的调用? 1) 到 Python 和 2) 到 C++ 应用程序?还是 Python 代码会加载并调用您的 C++ 应用程序? Node 的 child_process 东西将异步运行进程。如果您只想从节点内启动一个程序,那就可以了。 @StevenLeggett Python 脚本和 C++ 应用程序根本不交互;我想分别调用它们(它们也不需要按任何特定顺序)。 如果您可以从命令行执行 c++ 应用程序,那么我的解决方案应该可以工作...您可能需要查看 async 库以帮助控制流程,例如依次调用python然后调用c++ 【参考方案1】:

见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 AFAIK URL 组件,以及 unix/windows shell 命令,总是对所有内容使用字符串,所以我认为 python 应用程序有责任将其转换为数字。在正常的命令行调用中,你如何告诉 python 它是一个数字? 你是对的,这很有意义。我应该再考虑一下哈哈。谢谢! @spencer 可能有帮助的一件事是让节点应用程序使用您的数据创建一个 JSON 对象,它将区分数字与字符串。然后将其发送到 python 应用程序的标准输入并解析它【参考方案2】:

可能是一个老问题,但其中一些参考资料将提供更多细节和在 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

您可以使用向 python shell 发送消息 pyshell.send('hello');

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

第二种方式 - 另一个你可以参考的包是 node python ,你必须这样做npm install node-python

第三种方式 - 您可以参考这个问题,您可以在其中找到使用子进程的示例 - How to invoke external scripts/programs from node.js

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

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

【讨论】:

如果我可以从节点生成一个 python 进程,我已经运行了一个节点服务器和一个在守护线程模式下运行的 python 脚本,我想从节点访问 python 中的变量,如何你会这样做吗

以上是关于如何从 node.js 调用外部脚本/程序的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Node.js 中执行外部程序?

Node.js - 如何从 app.js 外部发出 socket.io 事件?

从Node.JS中的外部.js文件调用方法

如何从 mac 上的 node.js 脚本启动电子应用程序?

从 Node.js 调用 C++ 库(Node addons / node-ffi)

node.js 从脚本调用函数来更新 UI