节点js后端调用python函数

时间:2017-06-16 04:09:58

标签: javascript python node.js

我有点修复 - 我的后端运行了一个node.js应用程序,我有一大堆用Python编写的代码。这个Python程序需要在后台持续运行,我需要从一些客户端的API调用中的JavaScript代码中调用该程序中的函数。
我当时正在考虑将Python程序作为守护程序运行,但我无法通过我的javascript代码找到关于如何在该守护程序上调用函数的任何内容。
我也从未使用过守护进程,所以在这一点上,我一无所知。我想知道这样的事情是否可行。

我能想到的唯一另一个选择是切换到Django并将数据作为Django应用程序本身的一部分进行维护。我能做到这一点,但我不愿意。我不能在JavaScript中编写Python代码,因为它依赖于我在npm上找不到的一些独占库。

如果有人以前遇到过这个问题,请告诉我。谢谢!

2 个答案:

答案 0 :(得分:2)

这是一个简单的例子(pip install flask)。假设函数是“这是一个真正的单词”;繁重的准备任务正在加载字典。这是代码:

from flask import Flask, request, jsonify
app = Flask(__name__)

# heavy loading
dictionary = frozenset(
        line.rstrip('\n') for line in open('/usr/share/dict/words'))

# lightweight processing
@app.route('/real_word', methods=['POST'])
def real_word():
    result = request.form['word'] in dictionary
    return jsonify(result)

# quick-and-dirty start
if __name__ == '__main__':
    app.run(host='127.0.0.1', port=7990)

当您运行它时,您可以执行127.0.0.1:7990/real_word的请求,将您的单词作为POST参数发送。例如,假设npm install request

var request = require('request');

function realWord(word) {
  return new Promise(function(fulfill, reject) {
    request.post(
      'http://127.0.0.1:7990/real_word', {
        form: {
          word: word
        }
      },
      function (error, response, body) {
        if (!error && response.statusCode == 200) {
          fulfill(JSON.parse(body));
        } else {
          reject(error, response);
        }
      }
    );
  });
}

realWord("nuclear").then(console.log); // true
realWord("nucular").then(console.log); // false

(显然,在一个如此简单的例子中,读取单词列表几乎不会“沉重”,并且没有理由JSONify单个布尔值;但是您可以采用完全相同的代码结构并将其应用于包装漂亮任何功能,任何类型的输入/输出,你可以序列化。)

如果只是为了满足您的需求,您可以按原样运行Python程序;如果你想要一些生产质量的产品,请查看如何在WSGI容器上托管Flask应用程序,如Gunicorn或mod_wsgi。

答案 1 :(得分:0)

您可以使用节点的子进程来调用python脚本,如果您愿意,甚至可以将结果反馈给javascript?

https://nodejs.org/api/child_process.html

https://medium.freecodecamp.com/node-js-child-processes-everything-you-need-to-know-e69498fe970a

Javascript.js

var exec = require('child_process').exec;


cmd = `python python.py` // insert any command line argument


exec(cmd, function(error, stdout, stderr) {
     console.log(stdout);
});

Python.py

print("Heyo");

即使这个例子只从控制台捕获一个输出,你也可以实现一个流。