【问题标题】:Call Python function from JavaScript code从 JavaScript 代码调用 Python 函数
【发布时间】:2012-10-21 22:45:09
【问题描述】:

我想从 JavaScript 代码调用 Python 函数,因为在 JavaScript 中没有替代方法可以做我想做的事。这可能吗?你能调整下面的 sn-p 工作吗?

JavaScript 代码:

var tag = document.getElementsByTagName("p")[0];
text = tag.innerHTML;
// Here I would like to call the Python interpreter with Python function
arrOfStrings = openSomehowPythonInterpreter("~/pythoncode.py", "processParagraph(text)");

~/pythoncode.py 包含使用高级库的函数,这些函数在 JavaScript 中不容易编写:

import nltk # is not in JavaScript
def processParagraph(text):
  ...
  nltk calls
  ...
  return lst # returns a list of strings (will be converted to JavaScript array)

【问题讨论】:

  • 不,浏览器(幸运的是)不会执行任意 Python 代码。您需要在服务器中运行它。
  • Javascript 在客户端运行。我假设 python 在服务器上运行。您可以向服务器发送 ajax 请求。不会很快。
  • 使用 ajax,将文本发送到服务器上的 python 脚本。设置脚本以易于解析(对于 js)表示法(如 JSON)返回数据,并将结果分配给成功处理程序中的 arrOfStrings。
  • 你可以在浏览器中运行官方的Python解释器,使用clang和Emscripten编译它。这是以前做过的。
  • @FredFoo,如果浏览器没有运行 ECMAScript(由于相当可疑的历史原因而被称为 JavaScript),那么幸运的是。自 90 年代以来,浏览器一直在运行 Python 的安全子集(这就是任何人在浏览器中运行任何东西的意思,尽管你的稻草人),因此我们不必处理当前的网络混乱。

标签: javascript python function integration


【解决方案1】:

您只需要向您的 pythoncode 发出 ajax 请求。 您可以使用 jquery http://api.jquery.com/jQuery.ajax/ 执行此操作,或仅使用 javascript

$.ajax({
  type: "POST",
  url: "~/pythoncode.py",
  data: { param: text}
}).done(function( o ) {
   // do something
});

【讨论】:

  • 看起来很有趣。 processParagraph(text) 的调用可能在哪里,以便返回值以变量 arrOfStrings 结尾?
  • 我在 firebug 中运行 this 代码,但它记录了 []
  • 好的,那它是怎么回事?我的 Python 文件包含正确的函数。我应该在 Python 中调用函数并且参数是 sys.argv[1]?
  • 感谢您的回答,但是为了执行 python 脚本,它必须由通过 CGI 或 WSGI 支持它的 Web 服务器部署。您能否在回答中包括如何解决该问题?
  • 哦,如果我知道该怎么做,我很乐意编辑您的答案,我希望您能提供一些建议,因为我收到此错误XMLHttpRequest cannot load file:~/pythoncode.py. Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resource,即使我明白问题是什么不知道如何解决。任何有用的指针?非常感谢。 (顺便说一句...chessheaven 看起来真的很棒!我一定会试一试的,幸好你把一个可爱的女孩放在你的头像中;))
【解决方案2】:

来自document.getElementsByTagName 我猜你正在浏览器中运行 javascript。

向浏览器中运行的 javascript 公开功能的传统方式是使用 AJAX 调用远程 URL。 AJAX 中的 X 代表 XML,但现在每个人都使用 JSON 而不是 XML。

例如,使用 jQuery,您可以执行以下操作:

$.getJSON('http://example.com/your/webservice?param1=x&param2=y', 
    function(data, textStatus, jqXHR) {
        alert(data);
    }
)

您需要在服务器端实现一个 python 网络服务。对于简单的网络服务,我喜欢使用Flask

典型的实现如下:

@app.route("/your/webservice")
def my_webservice():
    return jsonify(result=some_function(**request.args)) 

您可以使用silverlight 在浏览器中运行 IronPython(一种 Python.Net),但我不知道 NLTK 是否可用于 IronPython。

【讨论】:

    【解决方案3】:

    通常你会使用看起来像这样的 ajax 请求来完成此操作

    var xhr = new XMLHttpRequest();
    xhr.open("GET", "pythoncode.py?text=" + text, true);
    xhr.responseType = "JSON";
    xhr.onload = function(e) {
      var arrOfStrings = JSON.parse(xhr.response);
    }
    xhr.send();
    

    【讨论】:

      【解决方案4】:

      通过流程进行通信

      例子:

      Python:此 Python 代码块应返回随机温度。

      # sensor.py
      
      import random, time
      while True:
          time.sleep(random.random() * 5)  # wait 0 to 5 seconds
          temperature = (random.random() * 20) - 5  # -5 to 15
          print(temperature, flush=True, end='')
      

      Javascript (Nodejs):这里我们需要生成一个新的子进程来运行我们的python代码,然后得到打印输出。

      // temperature-listener.js
      
      const { spawn } = require('child_process');
      const temperatures = []; // Store readings
      
      const sensor = spawn('python', ['sensor.py']);
      sensor.stdout.on('data', function(data) {
      
          // convert Buffer object to Float
          temperatures.push(parseFloat(data));
          console.log(temperatures);
      });
      

      【讨论】:

        【解决方案5】:

        没有 Python 程序就无法从 JavaScript 运行 .py 文件,就像没有文本编辑器就无法打开 .txt 文件一样。但是在 Web API 服务器(下例中的 IIS)的帮助下,整个事情变得轻而易举。

        1. 安装python并创建示例文件test.py

          import sys
          # print sys.argv[0] prints test.py
          # print sys.argv[1] prints your_var_1
          
          def hello():
              print "Hi" + " " + sys.argv[1]
          
          if __name__ == "__main__":
              hello()
          
        2. 在您的 Web API 服务器中创建一个方法

          [HttpGet]
          public string SayHi(string id)
          {
              string fileName = HostingEnvironment.MapPath("~/Pyphon") + "\\" + "test.py";          
          
              Process p = new Process();
              p.StartInfo = new ProcessStartInfo(@"C:\Python27\python.exe", fileName + " " + id)
              {
                  RedirectStandardOutput = true,
                  UseShellExecute = false,
                  CreateNoWindow = true
              };
              p.Start();
          
              return p.StandardOutput.ReadToEnd();                  
          }
          
        3. 现在是你的 JavaScript:

          function processSayingHi() {          
             var your_param = 'abc';
             $.ajax({
                 url: '/api/your_controller_name/SayHi/' + your_param,
                 type: 'GET',
                 success: function (response) {
                     console.log(response);
                 },
                 error: function (error) {
                     console.log(error);
                 }
              });
          }
          

        请记住,您的 .py 文件不会在您用户的计算机上运行,​​而是在服务器上运行。

        【讨论】:

          【解决方案6】:

          尽管有一些回复和 cmets 建议,有 a number of ways 在前端使用 Python。特别是对于您的问题,请参阅this reply

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-01-16
            • 1970-01-01
            • 1970-01-01
            • 2012-07-29
            • 2014-05-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多