Вызов функции 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)
Ответы
Ответ 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¶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.
Ответ 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);
}
});
}