जावास्क्रिप्ट कोड से पायथन फ़ंक्शन को कॉल करें


85

मैं जावास्क्रिप्ट कोड से एक पायथन फ़ंक्शन को कॉल करना चाहूंगा, क्योंकि मुझे जो चाहिए उसे करने के लिए जावास्क्रिप्ट में कोई विकल्प नहीं है। क्या यह संभव है? आप काम करने के लिए नीचे स्निपेट समायोजित कर सकते हैं?

जावास्क्रिप्ट कोड:

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 उन्नत पुस्तकालयों का उपयोग करने वाले फ़ंक्शंस में जावास्क्रिप्ट में समतुल्य लिखना आसान नहीं है:

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

8
नहीं, ब्राउज़र (सौभाग्य से) मनमाने पायथन कोड को निष्पादित नहीं करेगा। आप इसे एक सर्वर में चलाना चाहेंगे।
फ्रेड फू

जावास्क्रिप्ट क्लाइंट पर चलता है। मुझे लगता है कि अजगर सर्वर पर चलता है। आप सर्वर को अजाक्स अनुरोध भेज सकते हैं। यह तेज नहीं होगा।
जॉन ड्वोरक

1
अजाक्स का उपयोग करते हुए, अपने सर्वर पर एक अजगर स्क्रिप्ट को टेक्स्ट भेजें। एक आसान डेटा पार्स करने के लिए (js के लिए) संकेतन (JSON की तरह) में स्क्रिप्ट सेट करें और परिणाम को सफल हैंडलर में arrOfStrings पर असाइन करें।
असद सईदुद्दीन

5
आप ब्राउज़र में आधिकारिक पायथन इंटरप्रेटर को क्लैंग और एम्सस्क्रिप्टेन का उपयोग करके चला सकते हैं । यह पहले भी किया जा चुका है।

1
@FredFoo, वास्तव में भाग्यशाली क्या होगा यदि ब्राउज़र ECMAScript (जिसे संदिग्ध ऐतिहासिक कारणों के लिए जावास्क्रिप्ट कहा जाता है) नहीं चलाया गया है। यह भी सौभाग्यशाली होगा कि यदि ब्राउज़र एक सुरक्षित सबसेट चला रहा हो (जो कि किसी के चलने का मतलब है) 90 के दशक से पाइथन के ब्राउज़र में कुछ भी, आपका स्ट्रॉ मैन भले ही न हो) इसलिए हमें वर्तमान वेब गड़बड़ से निपटना नहीं होगा।
jdk1.0

जवाबों:


58

आपको बस अपने पायथनकोड को एक अजाक्स अनुरोध करने की आवश्यकता है। आप इसे jquery http://api.jquery.com/jQuery.ajax/ के साथ कर सकते हैं , या सिर्फ जावास्क्रिप्ट का उपयोग कर सकते हैं

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

1
दिलचस्प लगता है। कहां से कॉल किया जा सकता है processParagraph(text)ताकि चर में रिटर्न मान समाप्त हो जाए arrOfStrings?
xralf

2
मैं इस कोड को []
फायरबग

2
ठीक है, तो यह सही कैसे है? मेरी पायथन फ़ाइल में सही फ़ंक्शन है। क्या मुझे पायथन में फ़ंक्शन को कॉल करना चाहिए और तर्क sys.argv [1] होगा?
xralf

7
उत्तर के लिए धन्यवाद, लेकिन अजगर स्क्रिप्ट को निष्पादित करने के लिए इसे एक वेब सर्वर द्वारा तैनात किया जाना चाहिए जो CGI या WSGI के माध्यम से इसका समर्थन करता है। क्या आप कृपया अपने उत्तर में शामिल कर सकते हैं कि उस समस्या को कैसे हल किया जाए?
मत्तेओ

2
ओह, मुझे आपके उत्तर को संपादित करने में बहुत खुशी होगी अगर मुझे पता था कि मुझे यह कैसे करना है, मैं उम्मीद कर रहा था कि आप कुछ सलाह दे सकते हैं, क्योंकि मुझे यह त्रुटि मिल रही है XMLHttpRequest cannot load file:~/pythoncode.py. Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resourceऔर भले ही मुझे समझ में आया कि समस्या क्या है, कैसे पता नहीं है इसे हल करो। कोई उपयोगी सूचक? बहुत बहुत धन्यवाद। (btw ... शतरंज का खेल वास्तव में बहुत बढ़िया लगता है! मैं इसे ज़रूर आज़माऊंगा, अच्छी बात है कि आप अपनी प्रोफ़ाइल तस्वीर में एक प्यारी लड़की को डालते हैं;))
मैटो

26

से document.getElementsByTagNameमुझे लगता है कि आप एक ब्राउज़र में जावास्क्रिप्ट चल रहे हैं।

ब्राउज़र में चल रहे जावास्क्रिप्ट को कार्यक्षमता को उजागर करने का पारंपरिक तरीका AJAX का उपयोग करके एक दूरस्थ URL को कॉल कर रहा है। AJAX में X, XML के लिए है, लेकिन आजकल हर कोई XML के बजाय JSON का उपयोग करता है।

उदाहरण के लिए, jQuery का उपयोग करके आप कुछ ऐसा कर सकते हैं:

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

आपको सर्वर साइड पर एक अजगर वेबसर्विस लागू करने की आवश्यकता होगी। सरल वेबसर्विस के लिए मुझे फ्लास्क का उपयोग करना पसंद है ।

एक सामान्य कार्यान्वयन जैसा दिखता है:

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

आप के साथ ब्राउज़र में IronPython (Python.Net की तरह) चला सकते हैं Silverlight , लेकिन अगर NLTK IronPython के लिए उपलब्ध है मैं नहीं जानता।


9

आमतौर पर आप इसे एक ऐजैक्स अनुरोध का उपयोग करके पूरा करते हैं जो दिखता है

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 फाइलें नहीं चला सकते हैं जैसे कि आप बिना टेक्स्ट एडिटर के .txt फाइलें नहीं खोल सकते। लेकिन वेब API सर्वर (नीचे उदाहरण में IIS) की मदद से पूरी चीज एक सांस बन जाती है।

  1. अजगर स्थापित करें और एक नमूना फ़ाइल 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. अपने वेब एपीआई सर्वर में एक विधि बनाएँ

    [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. और अब आपके जावास्क्रिप्ट के लिए:

    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 फ़ाइल आपके उपयोगकर्ता के कंप्यूटर पर नहीं, बल्कि सर्वर पर चलेगी।


1

प्रक्रियाओं के माध्यम से संचार करना

उदाहरण:

पायथन: इस अजगर कोड ब्लॉक को यादृच्छिक तापमान वापस करना चाहिए।

# 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='')

जावास्क्रिप्ट (Nodejs): यहां हमें अपने पायथन कोड को चलाने के लिए एक नई चाइल्ड प्रोसेस को स्पान करना होगा और फिर प्रिंटेड आउटपुट प्राप्त करना होगा।

// 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);
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.