web-dev-qa-db-ja.com

JavaScriptコードからPython関数を呼び出す

JavaScriptにはPython関数を呼び出したいのですが、JavaScriptには私がやりたいことをするための代替手段がないからです。これは可能ですか?動作するように以下のスニペットを調整できますか?

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には、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)
68
xralf

必要なのは、pythoncodeにajaxリクエストを行うことだけです。 jquery http://api.jquery.com/jQuery.ajax/ でこれを行うか、javascriptのみを使用します。

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

document.getElementsByTagNameから、ブラウザでJavaScriptを実行していると思います。

ブラウザで実行されているJavaScriptに機能を公開する従来の方法は、AJAXを使用してリモートURLを呼び出すことです。 AJAXのXはXML用ですが、今日では誰もがXMLではなくJSONを使用しています。

たとえば、jQueryを使用すると、次のようなことができます。

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

サーバー側でpython webserviceを実装する必要があります。単純なWebサービスの場合は、 Flask を使用します。

典型的な実装は次のようになります。

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

ブラウザでIronPython(Python.Netの一種)を silverlight で実行できますが、IronPythonでNLTKを使用できるかどうかはわかりません。

24
Paulo Scardine

通常、次のようなajaxリクエストを使用してこれを達成します。

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
Asad Saeeduddin

テキストエディタなしで.txtファイルを開くことができないように、PythonプログラムなしでJavaScriptから.pyファイルを実行することはできません。しかし、Web APIサーバー(以下の例のIIS)の助けを借りて、全体が息づいています。

  1. pythonをインストールし、サンプルファイル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 __== "__main__":
        hello()
    
  2. Web APIサーバーでメソッドを作成する

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

.pyファイルはユーザーのコンピューターではなく、サーバーで実行されることに注意してください。

3
azakgaim