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'])
問題を解決しました。同じ問題を抱えている可能性のある将来の読者のために説明します。
Electron Builderを使用すると、アプリケーションのソースコードをelectronファイルにパッケージ化しないためのいくつかのオプションがあります。これらのオプションは次のとおりです。
asar
Electronのアーカイブ形式を使用して、アプリケーションのソースコードをアーカイブにパッケージ化するかどうか。デフォルトはtrueです。 Node展開する必要のあるモジュールは自動的に検出されます。明示的にasarUnpackを設定する必要はありません。これが機能しない場合は問題を報告してください。
または、asarオプションのオブジェクトを渡すことができます。
asarUnpack
Appディレクトリに関連するglobパターン。これは、asarアーカイブを作成するときに展開するファイルを指定します。
asar
をfalse
に設定すると問題は解決しますが、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])