Appelez la fonction Python à partir du code Javascript

Je voudrais appeler une fonction Python à partir du code Javascript, car il n'y a pas d'alternative dans Javascript pour faire ce que je veux. Est-ce possible? Pourriez-vous ajuster l'extrait ci-dessous pour fonctionner?

Partie 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)
48
demandé sur xralf 2012-11-01 14:52:29

4 réponses

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
});
37
répondu Salvador Dali 2012-11-01 11:01:48

À partir du document.getElementsByTagName je suppose que vous exécutez le javascript dans un navigateur.

La façon traditionnelle d'exposer la fonctionnalité à javascript en cours d'exécution dans le navigateur est d'appeler une URL distante en utilisant AJAX. Le X en 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 service web python côté serveur. Pour les services web simples, j'aime utiliser Flask .

Un l'implémentation typique ressemble à:

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

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

24
répondu Paulo Scardine 2012-11-01 11:18:16

Généralement, vous devez accomplir cela en utilisant une requête ajax qui ressemble à

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
répondu Asad Saeeduddin 2018-06-07 14:47:26

Vous ne pouvez pas exécuter les fichiers. py à partir de JavaScript sans le programme Python comme vous ne pouvez pas ouvrir .fichiers txt sans éditeur de texte. Mais le tout devient un souffle avec l'aide d'un serveur API Web (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 __name__ == "__main__":
        hello()
    
  2. Créez une méthode dans votre serveur D'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);
           }
        });
    }
    

Rappelez-vous que votre fichier. py ne fonctionnera pas l'ordinateur de votre utilisateur, mais à la place sur le serveur.

2
répondu azakgaim 2018-06-19 20:21:12