103 votes

Appeler une fonction Python à partir du code JavaScript

J'aimerais appeler une fonction Python à partir de code JavaScript, car il n'existe pas d'alternative en JavaScript pour faire ce que je veux. Est-ce possible ? Pourriez-vous adapter le snippet ci-dessous 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)

66voto

Salvador Dali Points 11667

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 utiliser uniquement le javascript

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

30voto

Paulo Scardine Points 17518

Desde el document.getElementsByTagName Je suppose que vous exécutez le javascript dans un navigateur.

La manière traditionnelle d'exposer une fonctionnalité au javascript s'exécutant dans le navigateur est d'appeler une URL distante en utilisant AJAX. Le X dans AJAX est pour XML, mais aujourd'hui 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 du côté serveur. Pour les webservices simples, j'aime utiliser Flacon .

Une mise en œuvre typique ressemble à cela :

@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.

11voto

Asad Points 22968

En règle générale, on utilise pour cela une requête ajax qui ressemble à ceci

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();

11voto

Michael Obasi Points 121

Communiquer par le biais de processus

Exemple :

Python : Ce bloc de code python devrait renvoyer des températures aléatoires.

# 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) : Ici, nous devons créer un nouveau processus enfant pour exécuter notre code python et obtenir la sortie imprimée.

// 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);
});

4voto

azakgaim Points 179

Il est impossible d'exécuter des fichiers .py à partir de JavaScript sans le programme Python, tout comme il est impossible d'ouvrir des fichiers .txt sans un éditeur de texte. Mais tout cela devient un jeu d'enfant avec l'aide d'un serveur d'API Web (IIS dans l'exemple ci-dessous).

  1. Installer python et créer un fichier d'exemple 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);
           }
        });
    }

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X