JavaScript kodundan Python işlevini çağırın


87

JavaScript kodundan bir Python işlevi çağırmak istiyorum, çünkü JavaScript'te istediğim şeyi yapmak için bir alternatif yok. Mümkün mü? Aşağıdaki pasajı çalışacak şekilde ayarlayabilir misiniz?

JavaScript kodu:

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'te yazması kolay eşdeğeri olmayan gelişmiş kitaplıkları kullanan işlevler içerir:

import nltk # is not in JavaScript
def processParagraph(text):
  ...
  nltk calls
  ...
  return lst # returns a list of strings (will be converted to JavaScript array)

9
Hayır, tarayıcılar (neyse ki) rastgele Python kodunu çalıştırmaz. Bunu bir sunucuda çalıştırmak isteyeceksiniz.
Fred Foo

Javascript istemcide çalışır. Python'un sunucuda çalıştığını varsayıyorum. Sunucuya bir ajax isteği gönderebilirsiniz. Hızlı olmayacak.
John Dvorak

1
Ajax kullanarak, sunucunuzdaki bir python betiğine metin gönderin. Betiği, ayrıştırması kolay (js için) gösterimde (JSON gibi) veri döndürmek için ayarlayın ve sonucu başarı işleyicisindeki arrOfStrings'e atayın.
Asad Saeeduddin

5
Resmi Python yorumlayıcısını tarayıcıda clang ve Emscripten kullanarak derleyerek çalıştırabilirsiniz . Bu daha önce yapıldı.

1
Tarayıcılar eğer @FredFoo, ne gerçekte şanslı olacağını ise vermedi ECMAScript'i çalıştırın (oldukça şüpheli tarihsel nedenlerle JavaScript denir.) Tarayıcılar çalıştırarak ne kimse aracı olan (güvenli alt kümesini çalışan olsaydı ne de şanslı olacağını ise 90'lardan beri Python'a bakılmaksızın tarayıcıda herhangi bir şey varsa, bu yüzden mevcut web karmaşasıyla uğraşmak zorunda kalmayacağız.
jdk1.0

Yanıtlar:


58

Tek ihtiyacınız olan şey pythoncode'unuza bir ajax isteği yapmaktır. Bunu jquery http://api.jquery.com/jQuery.ajax/ ile yapabilir veya sadece javascript kullanabilirsiniz

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

1
İlginç görünüyor. processParagraph(text)Dönüş değerlerinin değişkende bitmesi için çağrısı nerede olabilir arrOfStrings?
xralf

2
Bu kodu []
firebug'da

2
Tamam, peki nasıl doğru? Python dosyam doğru işlevi içeriyor. Python'da işlevi çağırmalı mıyım ve argüman sys.argv [1] olacak mı?
xralf

7
Cevabınız için teşekkürler, ancak python betiğinin çalıştırılması için CGI veya WSGI aracılığıyla destekleyen bir web sunucusu tarafından dağıtılması gerekir. Lütfen cevabınıza bu problemi nasıl çözeceğinizi ekler misiniz?
Matteo

2
Bunu nasıl yapacağımı bilseydim cevabınızı düzenlemekten çok mutlu olurdum, bazı tavsiyelerde bulunabileceğinizi umuyordum, çünkü bu hatayı alıyorum XMLHttpRequest cannot load file:~/pythoncode.py. Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resourceve sorunun ne olduğunu anlamama rağmen nasıl yapılacağını bilmiyorum çöz onu. Yararlı bir işaretçi var mı? Çok teşekkürler. (btw ... chessheaven gerçekten harika görünüyor! Kesinlikle deneyeceğim, iyi ki profil resminize sevimli bir kız koymuşsunuz;))
Matteo

26

Gönderen document.getElementsByTagNameI tarayıcıda JavaScript çalıştıran sanırım.

Tarayıcıda çalışan javascript işlevini göstermenin geleneksel yolu, AJAX kullanarak uzak URL'yi çağırmaktır. AJAX'taki X, XML içindir, ancak günümüzde herkes XML yerine JSON kullanıyor.

Örneğin, jQuery kullanarak aşağıdaki gibi bir şey yapabilirsiniz:

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

Sunucu tarafında bir python web hizmeti uygulamanız gerekecek. Basit web servisleri için Flask kullanmayı seviyorum .

Tipik bir uygulama şuna benzer:

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

Silverlight ile tarayıcıda IronPython'u (bir tür Python.Net) çalıştırabilirsiniz , ancak NLTK'nin IronPython için kullanılabilir olup olmadığını bilmiyorum.


9

Genellikle bunu, aşağıdaki gibi görünen bir ajax isteği kullanarak gerçekleştirirsiniz:

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 dosyalarını Python programı olmadan JavaScript'ten çalıştıramazsınız, çünkü .txt dosyalarını metin düzenleyici olmadan açamazsınız. Ancak her şey bir Web API Sunucusunun (aşağıdaki örnekte IIS) yardımıyla bir nefes alır.

  1. Python yükleyin ve örnek bir dosya oluşturun 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. Web API Sunucunuzda bir yöntem oluşturun

    [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. Ve şimdi JavaScript'iniz için:

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

.Py dosyanızın kullanıcının bilgisayarında değil, sunucuda çalışacağını unutmayın.


2

Süreçler aracılığıyla iletişim

Misal:

Python: Bu python kod bloğu rastgele sıcaklıklar döndürmelidir.

# 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): Burada python kodumuzu çalıştırmak için yeni bir çocuk süreç oluşturmamız ve ardından yazdırılan çıktıyı almamız gerekecek.

// 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);
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.