web-dev-qa-db-fra.com

Appelez Python fonction à partir de code JavaScript

J'aimerais appeler une fonction Python à partir de code JavaScript, car il n'y a pas d'alternative en JavaScript pour faire ce que je veux. Est-ce possible? Pourriez-vous ajuster l'extrait de code pour qu'il fonctionne?

Code 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 contient des fonctions utilisant des bibliothèques avancées qui n’ont pas d’équivalent facile à écrire en 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)
68
xralf

Tout ce dont vous avez besoin est de faire une requête ajax à votre pythoncode. Vous pouvez le faire avec jquery http://api.jquery.com/jQuery.ajax/ , ou utilisez simplement javascript

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

Du document.getElementsByTagName Je suppose que vous utilisez le javascript dans un navigateur.

La méthode traditionnelle pour exposer les fonctionnalités au javascript exécuté dans le navigateur consiste à appeler une URL distante à l'aide d'AJAX. Le X dans AJAX est pour XML, mais de nos jours tout le monde utilise JSON au lieu de XML.

Par exemple, en utilisant jQuery, vous pouvez faire quelque chose comme:

$.getJSON('http://example.com/your/webservice?param1=x&param2=y', 
    function(data, textStatus, jqXHR) {
        alert(data);
    }
)

Vous devrez implémenter un Webservice python côté serveur. Pour les services Web simples, j’aime utiliser Flask .

Une implémentation typique ressemble à:

@app.route("/your/webservice")
def my_webservice():
    return jsonify(result=some_function(**request.args)) 

Vous pouvez exécuter IronPython (genre de Python.Net) dans le navigateur avec silverlight , mais je ne sais pas si NLTK est disponible pour IronPython.

24
Paulo Scardine

Pour ce faire, vous devez généralement utiliser une requête ajax ressemblant à

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();
8
Asad Saeeduddin

Vous ne pouvez pas exécuter de fichiers .py à partir de JavaScript sans le programme Python, comme vous ne pouvez pas ouvrir de fichiers .txt sans un éditeur de texte. Mais le tout devient un souffle avec l’aide d’un serveur Web API (IIS). dans l'exemple ci-dessous).

  1. Installez python et créez un exemple de fichier 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 __== "__main__":
        hello()
    
  2. Créer une méthode dans votre serveur API Web

    [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. Et maintenant pour votre 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);
           }
        });
    }
    

N'oubliez pas que votre fichier .py ne s'exécutera pas sur l'ordinateur de l'utilisateur mais sur le serveur.

3
azakgaim