জাভাস্ক্রিপ্ট কোড থেকে পাইথন ফাংশন কল করুন


87

আমি জাভাস্ক্রিপ্ট কোড থেকে পাইথন ফাংশনটি কল করতে চাই, কারণ জাভাস্ক্রিপ্টে আমার যা করতে চান তার বিকল্প নেই। এটা কি সম্ভব? আপনি কি নীচের স্নিপেটটি কাজ করতে সামঞ্জস্য করতে পারেন?

জাভাস্ক্রিপ্ট কোড:

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)

9
না, ব্রাউজারগুলি (সৌভাগ্যক্রমে) স্বেচ্ছাচারিত পাইথন কোডটি কার্যকর করবে না। আপনি এটি একটি সার্ভারে চালাতে চাইবেন।
ফ্রেড ফু

জাভাস্ক্রিপ্ট ক্লায়েন্ট চালায়। আমি ধরে নিই যে অজগরটি সার্ভারে চলেছে। আপনি সার্ভারে একটি আজাক্স অনুরোধ পাঠাতে পারেন। এটি দ্রুত হবে না।
জন ডিভোরাক

4
এজ্যাক্স ব্যবহার করে আপনার সার্ভারে একটি অজগর স্ক্রিপ্টে পাঠ্য প্রেরণ করুন। সহজেই পার্স করার জন্য স্ক্রিপ্ট সেট আপ করুন (জেএস এর জন্য) স্বরলিপি (জেএসওনের মতো) এবং সাফল্যের হ্যান্ডলারের মধ্যে ফলাফলটি অ্যারফসস্ট্রিংগুলিতে নির্ধারণ করুন।
আসাদ সাইদুদ্দিন

4
আপনি ঝাঁকুনি এবং ব্যবহার করে সংকলন করে ব্রাউজারে সরকারী পাইথন দোভাষী ব্যবহার করতে পারেন ঝাঁকুনি এমস্ক্রিপ্টেন । এই আগে সম্পন্ন করা হয়েছে।

4
@ ফ্রেডফু, ব্রাউজারগুলি না করলে আসলে কী ভাগ্যবান হবে ECMAScript চালায় (তবে সন্দেহজনক historical কারণে এটি জাভাস্ক্রিপ্ট বলা হয়) আসলে কী ভাগ্যবান হবে তাও যদি ভাগ্যবান হয় তবে যদি ব্রাউজারগুলি একটি সুরক্ষিত সাবসেট চালাচ্ছিল (যার অর্থ কেউ রান করে বলতে চাইছে) 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
});

4
এটি আকর্ষণীয় দেখাচ্ছে। processParagraph(text)ফেরতের মানগুলি ভেরিয়েবলের মধ্যে শেষ হওয়ার জন্য কোথায় কল হতে পারে arrOfStrings?
xralf

4
আমি এই কোডটি ফায়ারবগে চালাচ্ছি, তবে এটি লগ হয়[]
xralf

4
ঠিক আছে, তাহলে এটা ঠিক কিভাবে? আমার পাইথন ফাইলটিতে সঠিক ফাংশন রয়েছে। আমি কি পাইথনে ফাংশনটি কল করব এবং তর্কটি sys.argv [1] হবে?
xralf

7
উত্তরের জন্য ধন্যবাদ, তবে পাইথন স্ক্রিপ্টটি কার্যকর করার জন্য এটি একটি ওয়েব সার্ভার দ্বারা স্থাপন করা উচিত যা এটি সিজিআই বা ডাব্লুএসজিআইয়ের মাধ্যমে সমর্থন করে। আপনি কীভাবে এই সমস্যার সমাধান করবেন আপনার উত্তরটিতে অন্তর্ভুক্ত করতে পারেন?
মাত্তেও

4
ওহ, আমি আপনার উত্তরটি সম্পাদন করতে পেরে খুব খুশি হব যদি আমি কীভাবে এটি করতে হয় তা জানতাম তবে আমি আশা করছিলাম যে আপনি কিছু পরামর্শ দিতে পারেন, কারণ আমি এই ত্রুটিটি XMLHttpRequest cannot load file:~/pythoncode.py. Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resourceপেয়েছি এবং যদিও আমি বুঝতে পেরেছি সমস্যাটি কীভাবে কীভাবে করতে হয় তা জানেন না ইহা সমাধান করো. কোন দরকারী পয়েন্টার? অনেক ধন্যবাদ. (বিটিডব্লিউ ... দাবাগান সত্যিই দুর্দান্ত লাগবে! আমি এটি চেষ্টা করে দেখতে চেষ্টা করব, ভাল জিনিস আপনি একটি সুন্দর মেয়েকে আপনার প্রোফাইল ছবিতে রেখেছেন;))
ম্যাটটিও

26

থেকে document.getElementsByTagName আমার অনুমান তুমি ব্রাউজারে JavaScript দৌড়াচ্ছে।

ব্রাউজারে চলমান জাভাস্ক্রিপ্টে কার্যকারিতা প্রকাশ করার Theতিহ্যগত উপায়টি AJAX ব্যবহার করে একটি রিমোট URL টি কল করছে। এক্স ইন এজেএক্স এক্সএমএল এর জন্য, তবে আজকাল সকলেই এক্সএমএলের পরিবর্তে জেএসএন ব্যবহার করে।

উদাহরণস্বরূপ, 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 ফাইল খুলতে পারবেন না। তবে ওয়েব এপিআই সার্ভারের (নীচের উদাহরণে আইআইএস) সাহায্যে পুরো জিনিসটি একটি দম হয়ে যায়।

  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 ফাইলটি আপনার ব্যবহারকারীর কম্পিউটারে চলবে না, পরিবর্তে সার্ভারে।


2

প্রক্রিয়া মাধ্যমে যোগাযোগ

উদাহরণ:

পাইথন: এই অজগর কোড ব্লকের এলোমেলো তাপমাত্রা ফিরে আসা উচিত।

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

জাভাস্ক্রিপ্ট (নোডেজ): এখানে আমাদের অজগর কোডটি চালাতে এবং তারপরে মুদ্রিত আউটপুট পেতে একটি নতুন শিশু প্রক্রিয়া তৈরি করতে হবে।

// 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);
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.