Подтвердить что ты не робот

Вызов функции Python из кода Javascript

Я хотел бы вызвать функцию Python из кода Javascript, потому что в 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)
4b9b3361

Ответ 1

Все, что вам нужно, это сделать запрос ajax на ваш pythoncode. Вы можете сделать это с помощью jquery http://api.jquery.com/jQuery.ajax/ или использовать только javascript

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

Ответ 2

Из document.getElementsByTagName я предполагаю, что вы запускаете javascript в браузере.

Традиционный способ раскрытия функциональности javascript, запущенного в браузере, вызывает удаленный URL-адрес с использованием AJAX. X в AJAX для 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)) 

Вы можете запустить IronPython (вид Python.Net) в браузере с silverlight, но я не знаю, является ли 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

Вы не можете запускать .py файлы из JavaScript без python.exe, как вы не можете запускать .txt файлы без notepad.exe. Но все это становится дыханием с помощью Web API Server (IIS в примере ниже).

  • Установите 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()
    
  • Создайте метод на сервере веб-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();                  
    }
    
  • И теперь для вашего 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);
           }
        });
    }