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


87

Я хотел бы вызвать функцию 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)

9
Нет, браузеры (к счастью) не будут выполнять произвольный код Python. Вы захотите запустить это на сервере.
Fred Foo

Javascript работает на клиенте. Я предполагаю, что питон работает на сервере. Вы можете отправить на сервер запрос ajax. Быстро не будет.
John Dvorak

1
Используя ajax, отправьте текст в скрипт python на вашем сервере. Настройте скрипт для возврата данных в удобной для анализа (для js) нотации (например, JSON) и присвойте результат arrOfStrings в обработчике успеха.
Асад Саидуддин 01

5
Вы можете запустить официальный интерпретатор Python в браузере, скомпилировав его с помощью clang и Emscripten . Это было сделано раньше.

1
@FredFoo, что на самом деле было бы удачно, так это если бы браузеры не запускали ECMAScript (который называется JavaScript по довольно сомнительным историческим причинам). Также было бы удачно, если бы браузеры использовали защищенное подмножество (что любой имеет в виду, запустив что угодно в браузере, не считая вашего соломенного человечка) Python с 90-х годов, поэтому нам не придется иметь дело с текущим веб-беспорядком.
jdk1.0 03

Ответы:


58

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

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

1
Смотрится интересно. Где мог быть вызов, processParagraph(text)чтобы возвращаемые значения оканчивались переменной arrOfStrings?
xralf 01

2
Я запускаю этот код в firebug, но он регистрируется[]
xralf

2
Хорошо, так как это правильно? Мой файл Python содержит правильную функцию. Должен ли я вызвать функцию в Python, и аргумент будет sys.argv [1]?
xralf 01

7
Спасибо за ответ, но для того, чтобы скрипт python запустился, он должен быть развернут на веб-сервере, который поддерживает его через CGI или WSGI. Не могли бы вы включить в свой ответ, как решить эту проблему?
Маттео

2
О, я был бы очень рад отредактировать ваш ответ, если бы знал, как это сделать, я надеялся, что вы дадите какой-нибудь совет, потому что я получаю эту ошибку, XMLHttpRequest cannot load file:~/pythoncode.py. Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resourceи хотя я понял, в чем проблема, не знаю, как Найди решение. Любой полезный указатель? Большое спасибо. (кстати ... Chessheaven кажется действительно потрясающим! Я обязательно попробую, хорошо, что вы поместили симпатичную девушку на свою аватарку;))
Маттео

26

От 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.


9

Обычно это делается с помощью запроса 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, как вы не можете открывать файлы .txt без текстового редактора. Но все это становится дыханием с помощью сервера веб-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. Создайте метод на своем сервере веб-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 запускается не на компьютере пользователя, а на сервере.


2

Общение через процессы

Пример:

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);
});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.