Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 调用python函数的Node js后端_Javascript_Python_Node.js - Fatal编程技术网

Javascript 调用python函数的Node js后端

Javascript 调用python函数的Node js后端,javascript,python,node.js,Javascript,Python,Node.js,我有点麻烦了——我有一个node.js应用程序在我的后端运行,我有一段用Python编写的代码。这个Python程序需要在后台持续运行,我需要从某个客户端的API调用中的JavaScript代码调用该程序中的函数 我曾考虑将Python程序作为守护进程运行,但我找不到任何关于如何通过javascript代码调用该守护进程上的函数的信息 我也从未使用过守护进程,所以在这一点上,我一无所知。我想知道这样的事情是否可能 我能想到的唯一其他选择是切换到Django,并将数据作为Django应用程序本身的

我有点麻烦了——我有一个node.js应用程序在我的后端运行,我有一段用Python编写的代码。这个Python程序需要在后台持续运行,我需要从某个客户端的API调用中的JavaScript代码调用该程序中的函数
我曾考虑将Python程序作为守护进程运行,但我找不到任何关于如何通过javascript代码调用该守护进程上的函数的信息
我也从未使用过守护进程,所以在这一点上,我一无所知。我想知道这样的事情是否可能

我能想到的唯一其他选择是切换到Django,并将数据作为Django应用程序本身的一部分进行维护。我可以这样做,但我宁愿不这样做。我不能用JavaScript编写Python代码,因为它依赖于一些我在npm上找不到的专用库


如果有人曾经遇到过这个问题,请告诉我。谢谢大家!

您可以使用节点的子进程来调用python脚本,如果愿意,您甚至可以将结果通过管道传回javascript

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");
即使此示例仅捕获控制台的单个输出,您也可以实现流。

下面是一个简单的示例(使用
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
的请求,将您的word作为POST参数发送。例如,假设
npm安装请求

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
(显然,在一个如此简单的示例中,读取单词列表几乎不算“沉重”,也没有理由将单个布尔值JSONIZE化;但您可以采用完全相同的代码结构,并将其应用于包装几乎任何函数,以及任何可以序列化的输入/输出类型。)


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

在启动脚本(假设是Linux环境)上,您不能也启动python部分吗?或者流程需要沟通吗?他们需要沟通。本质上,我希望JavaScript部分在每次调用API时触发python函数。python程序可以启动一个套接字服务器,监听特定端口。我假设Python程序中的函数需要输入参数,这样节点应用程序就可以连接并写入该套接字。Python端的套接字侦听器随后将处理传入的连接/数据并执行所需的例程。关于Python我不太清楚,但它需要几行Java代码,例如,谢谢你的回复。这听起来确实像是我想做的事情。我将尝试使用python套接字!更简单(但效率稍低)的方法是将Python程序转换为本地web服务(仔细想想,这只是在特定端口侦听的一个特例:D)。让它通过POST接受参数,并发送回JSON。如果需要,请将其限制为localhost。您可以使用像Flask这样的轻量级框架来包装Python函数。您可以很快地做到这一点(而与自定义协议和低级套接字混为一谈可能会占用您更多的宝贵时间)“此Python程序需要在后台不断运行”-大概是因为该程序的启动成本非常高。这使得按需生成流程变得不可行。假设我的示例没有流式输出,调整示例以流式输出应该很简单。仍然不确定如何使用套接字将是一个更好的解决方案..嘿,我感谢你的回答,但这不是我需要的。我需要js不断地与python交互。而@Amadan是对的。我不想在每次收到请求时都形成庞大的关系图(甚至可能是每秒多次)。