例でJavaScriptでPythonを使う方法


JavaScriptとPythonで経験を積んだので、両方の使い方を見つけたいと思います.だからたくさんの候補を探して見つけたpython-bridge 便利です.
この投稿では、JavaScriptを使用する方法を学びますasync await . あなたは既に両方の言語のコードを書いた場合、それは簡単ですが見つかります.
前提条件
  • python-bridge
  • JavaScript async programming
  • How to use pip
  • How to use NPM
  • PythonとJavaScriptのパッケージの扱い方を既に知っていると思います.
    読むべきだpython-bridge あなたがこのポストで読む前に、リポジトリと例に続いてください.
    ポストJavaScirpt async programming どのように大幅に使用する方法を理解するのに役立ちます.
    コード全体を最初に表示したい場合は、pyscript リポジトリ.
    目次
  • ハウpython-bridge 作品
  • async waitで例を改善する方法
  • Pythonパッケージの使い方
  • 同等のJavaScriptパッケージとPythonパッケージを比較する
  • 結論

  • 1 . Pythonブリッジの仕組み
    私はあなたのためのドキュメントを読むためにあなたの時間を既に投資python-bridge .
    その主な例は
    'use strict';
    
    let assert = require('assert');
    let pythonBridge = require('python-bridge');
    
    let python = pythonBridge();
    
    python.ex`import math`;
    python`math.sqrt(9)`.then(x => assert.equal(x, 3));
    
    let list = [3, 4, 2, 1];
    python`sorted(${list})`.then(x => assert.deepEqual(x, list.sort()));
    
    python.end();
    
    Pythonブリッジパッケージを最初にインストールしないでください.
    $yarn add python-bridge
    $touch py.js
    
    あなたとしばらくの間それを再生する場合node py.js , あなたはそれの主なAPIはpython.ex and python .
     python.ex`import math`;
     python`math.sqrt(9)`.then(x => assert.equal(x, 3));
    
    彼らは上記で使用されたように.
    JavaScriptの約束を使用してPythonからの戻り値を消費することができます.
    あなたのマシンにインストールされたノードとPythonの両方を持っていて、それをテストしたら、問題なく動作します.
    また、私たちが使うべきであることに注意するのも重要です${variable} JavaScriptからPythonへ変数を渡す構文.
    JavaScriptでPythonを使用しており、Python仮想マシンからデータをノードに呼び出すので、それは妥当です.
    これは既に素晴らしい.Pythonとそのモジュールを、Promise APIでJavaScript内に使用できます.
    あなたのようなお気に入りのPythonモジュールでテストすることができますNumpy , Pandas , pyautogui この点で、または他の組み込みモジュールの場合.
    それをするには$pip -m venv <yourproject> and $source activate 仮想envをアクティブにして、最初にテストしたい依存関係をインストールするには、パッケージが同じフォルダにある必要があります.JSONが位置する.

    2 . async waitを使用した例の改善方法
    あなたはすでにそれが役に立つことがあります.しかし、Pythonコードやモジュールなどから計算された様々なデータを保存し使用するという約束だけを使うのは簡単ではありませんNumpy and Pandas .
    Pythonからデータを簡単に変数として保存し、必要に応じてJavaScriptの中でそれらを使用する方法を見つけるのがより良いでしょう.
    JavaScriptを使う時間ですasync await 以下の例のような構文です.
    // index.js
    'use strict';
    
    const assert = require('assert');
    const python = require('python-bridge');
    
    const py = python(); // return value
    
    const {
      ex, // no return value
      end,
    } = py;
    
    const list = [3, 4, 2, 1];
    
    ex`import math`
    
    async function pyscript() {
      try {
        let math = await py`math.sqrt(9)`;
        let sort = await py`sorted(${list})`;
    
        assert.eqaul(math, 3);
        assert.deepEqual(sort, list.sort());
    
      } catch (e) {
        console.log(e)
      }
      end();
    }
    
    (async () => {
      pyscript();
      console.log("Python works in JavaScript");
    })().catch(error => {
      console.log("error");
      console.error(error);
    });
    
    前のコードからの例は、async waitで読みやすくなっていることがわかります.
    また、各値をPythonから分離して別々の変数として保存することもできます.
    $ node pyでテストできます.JSとそれがうまくいくことを望みます.
    私は、あなたがasync待ちがここで働く方法の説明を必要としないと思います.あなたが既に読んでほしいone that explains it best .
    上記の例では、Pythonからデータを変数として保存したい場合は、キーワードを待つ必要があります.後で使用するたびにそれらを使用します.
    関数名の前にasyncを使用してPythonの仮想マシンから値を待つと、PythonとJavaCapptの間でデータを簡単に渡し、両方を使うことができます.jsファイルpython-bridge .
    最近、私はBerNumberのための16進数値をerc 20トークンをテストして、JavaScriptでテストファイルの中でそれを比較しなければなりませんでした.
    それで、私はそれがこのポストのために使われるものを使うのに役に立つと思いました.JavaScriptよりもPythonで多少簡単に行えば、ここで使用するコードを適応させる方が良いでしょう.
    // py.js
    const python = require('python-bridge');
    
    const py = python(); // return value
    const { end } = py;
    
    async function bigNumberToHex(bigNumber) {
      try {
        const hexFromBigNumber = await py`hex(${bigNumber})`;
        return hexFromBigNumber;
      } catch (error) {
        console.log("error");
        console.error(error);
      } finally {
          end();
      }
    }
    
    (async () => {
      const hex = await bigNumberToHex(10 ** 10);
      console.log(hex);
    })().catch(error => {
      console.log("error");
      console.error(error);
    });
    
    使用に比較することができますnode py.js または、以下のコードに手動で似ているか、または使用するPythonコンソールでテストしますa website あなたがそれを見つけることができるならば.
    このポストに使用するコードを使用すると、JavaScriptを使用してPythonに慣れている場合は、もう一つのオプションがあります.次に、あなたはそれを使用する適切な機会を見つけることができればあなたの時間を節約することができます.
    $python3
    >>> hex(1000000000000000000000000)
    '0xd3c21bcecceda1000000'
    >>> hex(1000000000000000000000000000000)
    '0xc9f2c9cd04674edea40000000'
    >>> hex(1000000000000000000000000000000000)
    '0x314dc6448d9338c15b0a00000000'
    >>> hex(1000000000000000000000000)
    '0xd3c21bcecceda1000000'
    >>> 10 ** 26
    100000000000000000000000000
    >>> hex(_)
    '0x52b7d2dcc80cd2e4000000'
    

    3 . JavaScriptのPythonパッケージの使い方
    前の部分では、我々はどのように使用してサイトからの例を作るためにAsyncを待つ方法を学んだ.しかし、いくつかのよく知られているパッケージでもそれらを使用し、有用な例を確認できます.
    それで、我々はこの部分でいくつかのよく知られたパイソンパッケージを含みます.
    Numpy , Pandas and pyautogui Pythonがデータ操作と自動化において強くて、それらがそれらのための主なPythonパッケージであると思うので、例として使われます.
    まずコードをお見せしましょう.それらを使用するには、まず最初にそれらをインストールする必要があります、そして、Venvが正しくPythonパッケージのために活性化される間、テストを使用するために適切な場所にいるべきです.
    Pyを更新します.jsと$node py.js テストするには
    'use strict';
    
    const python = require('python-bridge');
    const py = python(); // It returns value!
    const {
      ex, // It does not return value!
      end,
    } = py;
    
    const list = [3, 4, 2, 1];
    
    // <python modules>
    
    ex`import math`;
    ex`import pyautogui`;
    ex`import numpy as np`;
    ex`import pandas`;
    
    // </>
    
    // 1.
    function fromPython(pycode = {}) {
      return JSON.stringify(pycode);
    }
    
    function toJavaScript(pystr = "") {
      return JSON.parse(pystr)
    }
    
    function fromPy(pycode = {}) {
    }
      return toJavaScript(fromPython(pycode));
    
    async function pyscript() {
      try {
        let math = await py`math.sqrt(9)`;
        let sort = await py`sorted(${list})`;
    
        // 2.
        ex`
          value = np.random.randint(0, 7, size = 10)
          returnit = pandas.Series(value).tolist()
       `;
        let returnExample = await py`returnit`; // return value with await and python
        console.log(returnExample);
    
        // 3.
        const test = (math + sort.reduce((a, c) => a + c, 0))
    
        // 4.
        let position = await py`pyautogui.position()`
        console.log(position); // object
    
        // 5.
        ex`pyautogui.screenshot("test.png")`;
        ex`print(str(${test}))`;
        ex`pyautogui.typewrite(str(${test}))`;
        py`pyautogui.typewrite("show it to me")`;
        py`pyautogui.moveTo(${test}, ${math})`;
    
      } catch (e) {
        console.log(e)
      }
      end();
    }
    
    (async () => {
      await pyscript();
    })().catch(error => {
      console.log("error");
      console.error(error);
    });
    
    このパッケージで遊んでいる間、パッケージ作者からの助けを借りてすべてがうまく動作しないことがわかりました.
    我々は、我々自身のプロジェクトのために彼らを使う方法を見つけるために、我々の時間を投資しなければなりません.
    1 . JSON APIを使用して、Pythonから戻り値をラップするか、JavaScript開発環境に入る前に文字列型の値に変換する機能を定義します.あなたが主に必要とするものはfromPy .(タイプ関連の問題に遭遇するたびに、Pythonによって与えられたjavascriptあるいはstr ()や他の型変換メソッドでtostring ()を使用することもできます.
    2 .テストNumpy and Pandas 本当に働くかどうか.あなたは、彼らが働いて、あなたが使う必要があるとわかるのを見ることができますpy PythonからJavaScriptへ値を返す必要があるときだけです.それ以外の場合はex 主に.
    3 . Pythonから値を使用し、JavaScript内で自由に使用できます.
    4 .マウスカーソルの現在位置を取得するにはpyautoGUIを使用します.私はJavaScriptパッケージでその等価物を見つけることができませんでした.JavaScriptモジュールがない場合は、代わりにPythonパッケージを使用することができます.
  • 様々なAPIをテストしますpyautogui はい.自分のマシンでテストして欲しい.あなたのマウス、キーボード、スクリーンショットすべての作品が表示されます.使えますpy 場合によっては使用できる場合もありますex また.
  • ここで使用されるパッケージと名前は重要でありません、そして、あなたのターンは彼らの中で最高を得ます.

    4 .同等のJavaScriptパッケージとPythonパッケージを比較する
    ここで使用するコードはプロトタイプ用です.あなたの時間を投資する準備ができている場合は、速度を比較するより良い方法を見つけることができます.
    それで、あなたがPythonをたくさん使うならば、あなたはそれが前の例で私より役に立つとわかりました.
    しかし、あなたはパフォーマンスを考慮するとき、それがJavaScriptの中にパイソンを使用する価値があると思われます、そして、類似したJavaScriptモジュールがあります.
    だから、簡単に比較しますNumpy and Numjs 彼らは同じ目的のために、非常に同様のAPIを提供するため.
    以下のコードスニペットを保存し、node py.js .
    'use strict'; // numpy_and_numjs_compare.js
    
    const python = require('python-bridge'); // https://www.npmjs.com/package/python-bridge
    const nj = require('numjs'); // www.npmjs.com/package/numjs
    
    const py = python(); // return value
    let {
      ex, // no return value
      end,
    } = py;
    
    // <Python Modules>
    
    ex`import numpy as np`;
    ex`import pandas`;
    
    // </>
    
    function fromPython(pycode = {}) {
      return JSON.stringify(pycode);
    }
    
    function toJavaScript(pystr = "") {
      return JSON.parse(pystr)
    }
    
    function fromPy(pycode = {}) {
      return toJavaScript(fromPython(pycode));
    }
    
    async function pyscript() {
      try {
        // If you want, use POSIX command line with $time after you read manual for that $man time
        // and tweak the example here
    
        // Test here is to compare time taken to assign return values to variables
    
        // console.log(new Date());
        // let testnumpy = fromPy(await py`np.arange(1000).reshape(50, 20).tolist()`);
        // console.log(new Date()); // 1.8 ~ 2 seconds
    
        console.log(new Date());
        let testnumjs = nj.arange(1000).reshape(50, 20).tolist();
        console.log(new Date()); // About 0.05 seconds
      } catch (e) { console.log(e) }
      end();
    }
    
    (async () => {
      await pyscript();
    })().catch(error => {
      console.log("error");
      console.error(error);
    });
    
    速度を比較するためにこの単純な実装で、あなたはすでに彼らのために選択肢があるとき、それがPythonパッケージの代わりにJavaScriptパッケージを使用するのがより良いかもしれないとわかります.
    これは、JavaScriptパッケージがPythonよりも高速であることを意味しません.Pythonパッケージを使用するこの方法では、Pythonの戻り値をノードコードに非同期に待つ必要があります.
    ポストの主な目的のためのテストではなく、速度を比較すると、私は詳細に動作するテストの例を見つけることはありません.あなたが望むならば、あなたはそれをよりよくすることができます.

    結論
    私は、このポストが同じファイルでPythonとJavascriptのためにコードを使用して、書きたいと思った誰かに役に立つことを望みます.
    また、私がPythonコードに詳しいことを試すこともありました.
    あなたがポストが好きならば、それを他と共有してください.より多くのポストは、私をここに来ています.私は、より多くのブロックチェーンと他の詰め物を共有する計画です.私はETHとPolkadotに興味があります.
    ありがとう.