Я хотел бы вызвать функцию 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)
Ответы:
Все, что вам нужно, это сделать ajax-запрос к вашему pythoncode. Вы можете сделать это с помощью 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
?[]
XMLHttpRequest cannot load file:~/pythoncode.py. Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resource
и хотя я понял, в чем проблема, не знаю, как Найди решение. Любой полезный указатель? Большое спасибо. (кстати ... Chessheaven кажется действительно потрясающим! Я обязательно попробую, хорошо, что вы поместили симпатичную девушку на свою аватарку;))От
document.getElementsByTagName
я предполагаю , что вы работаете в JavaScript в браузере.Традиционный способ предоставить функциональные возможности javascript, запущенному в браузере, - это вызвать удаленный URL-адрес с помощью AJAX. X в AJAX предназначен для XML, но в настоящее время все используют JSON вместо XML.
Например, с помощью jQuery вы можете сделать что-то вроде:
$.getJSON('http://example.com/your/webservice?param1=x¶m2=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.
источник
Обычно это делается с помощью запроса 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();
источник
Вы не можете запускать файлы .py из JavaScript без программы Python, как вы не можете открывать файлы .txt без текстового редактора. Но все это становится дыханием с помощью сервера веб-API (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); } }); }
Помните, что ваш файл .py запускается не на компьютере пользователя, а на сервере.
источник
Общение через процессы
Пример:
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); });
источник