如何从 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 - 如何从 app.js 外部发出 socket.io 事件?
如何从 mac 上的 node.js 脚本启动电子应用程序?