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


87

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)

9
いいえ、ブラウザは(幸いなことに)任意のPythonコードを実行しません。あなたはそれをサーバーで実行したいと思うでしょう。
Fred Foo 2012年

Javascriptはクライアントで実行されます。Pythonはサーバー上で実行されていると思います。ajaxリクエストをサーバーに送信できます。速くはありません。
ジョン・ドヴォルザーク

1
ajaxを使用して、サーバー上のpythonスクリプトにテキストを送信します。解析しやすい(jsの場合)表記(JSONなど)でデータを返すようにスクリプトを設定し、その結果を成功ハンドラーのarrOfStringsに割り当てます。
Asad Saeeduddin 2012年

5
clangとEmscriptenを使用してコンパイルすることにより、ブラウザーで公式のPythonインタープリターを実行できます。これは以前に行われたことがあります。

1
@ FredFoo、実際に幸運なのは、ブラウザーECMAScript(歴史的な理由でJavaScriptと呼ばれている)を実行しなかった場合です。また、ブラウザーが安全なサブセットを実行していた場合も幸運です(これは、実行することで誰もが意味することです)。 90年代以降のPythonのブラウザ内のすべてのもの(ストローマンにもかかわらず)なので、現在のWebの混乱に対処する必要はありません。
JDK1.0

回答:


58

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

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

1
面白そうですね。processParagraph(text)戻り値が変数で終わるように、の呼び出しはどこにありますarrOfStringsか?
xralf 2012年

2
私はこのコードを[]
firebug

2
さて、それはどのように正しいのですか?私のPythonファイルには正しい関数が含まれています。Pythonで関数を呼び出す必要があり、引数はsys.argv [1]になりますか?
xralf 2012年

7
回答ありがとうございますが、Pythonスクリプトを実行するには、CGIまたはWSGIを介してそれをサポートするWebサーバーによってデプロイする必要があります。その問題を解決する方法をあなたの答えに含めていただけませんか?
Matteo

2
ああ、私がそれを行う方法を知っていれば、あなたの答えを編集するのはとてもうれしいです、私はあなたがいくつかのアドバイスを提供できることを望んでいました、私はこのエラーXMLHttpRequest cannot load file:~/pythoncode.py. Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resourceを受け取っているので、問題が何であるかを理解していても方法がわかりませんそれを解決します。便利なポインタはありますか?どうもありがとう。(ところで...チェスヘブンは本当に素晴らしいようです!私は確かにそれを試してみます、あなたがあなたのプロフィール写真にかわいい女の子を入れたのは良いことです;))
Matteo

26

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

サーバー側にPythonWebサービスを実装する必要があります。単純なWebサービスの場合、Flaskを使用するのが好きです。

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

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

あなたは、ブラウザでのIronPython(Python.Netの一種)を実行することができますSilverlightのが、NLTKは、IronPythonのために利用可能である場合、私は知りません。


9

通常、これは次のような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();

4

テキストエディタなしで.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 __name__ == "__main__":
        hello()
    
  2. WebAPIサーバーでメソッドを作成します

    [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ファイルはユーザーのコンピューターではなく、サーバーで実行されることに注意してください。


2

プロセスを介したコミュニケーション

例:

Python:このPythonコードブロックはランダムな温度を返す必要があります。

# 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):ここでは、Pythonコードを実行して印刷出力を取得するために、新しい子プロセスを生成する必要があります。

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