web-dev-qa-db-ja.com

Electronアプリでpythonスクリプトを実行

NodeJSのchild_processモジュールを使用して、pythonスクリプトを実行するElectronプロジェクトがあります。Mypythonスクリプトは、プロジェクトのルートフォルダにあります。

pythonスクリプトを呼び出す方法は次のとおりです。

let py = spawn('python',['ResolvePosition.py', obsFilePath, navFilePath])
py.stdout.on('data', data => console.log('data : ', data.toString()))
py.on('close', ()=>{
  // Python ends, do stuff
})

Electronアプリケーションをnpm startで実行するとうまくいきます。npmモジュールelectron-builderを使用してWindowsの実行可能ファイルをビルドし、dist/win-unpacked/my-app.exeから実行可能ファイルを実行すると、動作しません。私のスクリプトがpython ./my-script-pyでアクセスできないこと。

それで、ビルドされたプロジェクトでこのコードを機能させるにはどうすればよいですか?

スクリプトを extraResources に含めることができます。

"build": {
    "extraResources": "python_scripts",
...

そして、ディレクトリはアプリのルートになります:

let python = spawn('python', [path.join(app.getAppPath(), '..', 'python_scripts/my_script.py'])
8
HdN8

問題を解決しました。同じ問題を抱えている可能性のある将来の読者のために説明します。

Electron Builderを使用すると、アプリケーションのソースコードをelectronファイルにパッケージ化しないためのいくつかのオプションがあります。これらのオプションは次のとおりです。

asar

Electronのアーカイブ形式を使用して、アプリケーションのソースコードをアーカイブにパッケージ化するかどうか。デフォルトはtrueです。 Node展開する必要のあるモジュールは自動的に検出されます。明示的にasarUnpackを設定する必要はありません。これが機能しない場合は問題を報告してください。

または、asarオプションのオブジェクトを渡すことができます。

asarUnpack

Appディレクトリに関連するglobパターン。これは、asarアーカイブを作成するときに展開するファイルを指定します。

DOCS

asarfalseに設定すると問題は解決しますが、electron-builder

したがって、フォルダに解凍する必要があるすべてのファイルを含め、"asarUnpack" : "my-folder/*"は正しい方法です。これで、解凍されたすべてのファイルが/resources/app.asar.unpacked/my-folder

考慮すべきもう1つのことは、パス'./ResolvePosition.py'は、NodeJSファイルが置かれているパスではなく、electronプロジェクトのルートフォルダを参照するため、使用する必要があります。

let python = spawn('python', [path.join(__dirname, '../app.asar.unpacked/my-folder', 'ResolvePosition.py'), obsFilePath, navFilePath])