100

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

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)
4

6 回答 6

65

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

$.ajax({
  type: "POST",
  url: "~/pythoncode.py",
  data: { param: text}
}).done(function( o ) {
   // do something
});
于 2012-11-01T11:01:48.030 回答
27

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 web 服务。对于简单的网络服务,我喜欢使用Flask

一个典型的实现如下所示:

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

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

于 2012-11-01T10:56:25.967 回答
11

通常,您将使用看起来像的 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();
于 2012-11-01T11:00:57.437 回答
8

通过流程进行沟通

例子:

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);
});
于 2019-12-01T12:25:15.430 回答
4

没有 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 文件不会在用户的计算机上运行,​​而是在服务器上运行。

于 2017-08-30T14:19:41.117 回答
2

尽管有一些回复和评论建议,有很多方法可以在前端使用 Python。特别是对于您的问题,请参阅此回复

于 2021-07-22T08:14:28.613 回答