Ich möchte eine Python-Funktion aus JavaScript-Code aufrufen, da es in JavaScript keine Alternative gibt, um das zu tun, was ich will. Ist das möglich? Könnten Sie das folgende Snippet anpassen, um zu funktionieren?
JavaScript-Code:
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
enthält Funktionen mit erweiterten Bibliotheken, die in JavaScript nicht einfach zu schreiben sind:
import nltk # is not in JavaScript
def processParagraph(text):
...
nltk calls
...
return lst # returns a list of strings (will be converted to JavaScript array)
Antworten:
Sie müssen lediglich eine Ajax-Anfrage an Ihren Pythoncode stellen. Sie können dies mit jquery http://api.jquery.com/jQuery.ajax/ tun oder einfach nur Javascript verwenden
$.ajax({ type: "POST", url: "~/pythoncode.py", data: { param: text} }).done(function( o ) { // do something });
quelle
processParagraph(text)
damit die Rückgabewerte in der Variablen endenarrOfStrings
?[]
XMLHttpRequest cannot load file:~/pythoncode.py. Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resource
und obwohl ich verstanden habe, was das Problem ist, weiß ich nicht, wie löse es. Irgendein nützlicher Zeiger? Vielen Dank. (Übrigens ... Schachhimmel scheint wirklich großartig! Ich werde es auf jeden Fall ausprobieren, gut, dass du ein süßes Mädchen in dein Profilbild aufgenommen hast;))Vom
document.getElementsByTagName
Ich denke , Sie JavaScript in einem Browser ausgeführt werden .Die traditionelle Methode, um Funktionen für Javascript verfügbar zu machen, das im Browser ausgeführt wird, besteht darin, eine Remote-URL mit AJAX aufzurufen. Das X in AJAX ist für XML, aber heutzutage verwendet jeder JSON anstelle von XML.
Mit jQuery können Sie beispielsweise Folgendes tun:
$.getJSON('http://example.com/your/webservice?param1=x¶m2=y', function(data, textStatus, jqXHR) { alert(data); } )
Sie müssen einen Python-Webservice auf der Serverseite implementieren. Für einfache Webservices verwende ich gerne Flask .
Eine typische Implementierung sieht folgendermaßen aus:
@app.route("/your/webservice") def my_webservice(): return jsonify(result=some_function(**request.args))
Sie können Ironpython (Art Python.Net) im Browser mit laufen Silverlight , aber ich weiß nicht , ob NLTK für Ironpython zur Verfügung steht.
quelle
Normalerweise erreichen Sie dies mit einer Ajax-Anforderung, die wie folgt aussieht
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();
quelle
Sie können keine .py-Dateien aus JavaScript ohne das Python-Programm ausführen, wie Sie keine .txt-Dateien ohne einen Texteditor öffnen können. Mit Hilfe eines Web-API-Servers (IIS im folgenden Beispiel) wird das Ganze jedoch zu einem Atemzug.
Installieren Sie Python und erstellen Sie eine Beispieldatei 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()
Erstellen Sie eine Methode in Ihrem Web-API-Server
[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(); }
Und jetzt zu Ihrem 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); } }); }
Denken Sie daran, dass Ihre .py-Datei nicht auf dem Computer Ihres Benutzers ausgeführt wird, sondern auf dem Server.
quelle
Kommunikation über Prozesse
Beispiel:
Python: Dieser Python-Codeblock sollte zufällige Temperaturen zurückgeben.
# 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): Hier müssen wir einen neuen untergeordneten Prozess erzeugen, um unseren Python-Code auszuführen und dann die gedruckte Ausgabe zu erhalten.
// 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); });
quelle