web-dev-qa-db-fra.com

Exécutez le script python dans l'application Electron

J'ai un projet Electron qui exécute un script python en utilisant le module child_process de NodeJS. Mon script python se trouve dans le dossier racine de mon projet).

Voici comment j'appelle le script 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
})

Cela fonctionne très bien si je lance mon application électronique avec npm start Lorsque je crée un exécutable pour Windows à l'aide du module npm electron-builder et exécutez l'exécutable à partir de dist/win-unpacked/my-app.exe, cela ne fonctionnera pas, il semble que mon script ne soit pas accessible avec python ./my-script-py.

Alors, comment puis-je faire fonctionner ce code pour le projet construit?

17

Vous pouvez inclure le script dans extraResources :

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

Et puis le répertoire sera à la racine de l'application:

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

J'ai résolu mon problème. Je vais expliquer pour d'éventuels futurs lecteurs ayant le même problème.

En utilisant le générateur d'électrons, il existe certaines options possibles pour ne pas empaqueter le code source de l'application dans un fichier électronique. Ces options sont:

asar

Que ce soit pour empaqueter le code source de l'application dans une archive, en utilisant le format d'archive d'Electron. La valeur par défaut est true. Node, qui doivent être décompressés, seront détectés automatiquement, vous n'avez pas besoin de définir explicitement asarUnpack - veuillez signaler le problème si cela ne fonctionne pas.

Ou vous pouvez passer l'objet des options asar.

asarUnpack

Un modèle global relatif au répertoire de l'application, qui spécifie les fichiers à décompresser lors de la création de l'archive asar.

DOCS

Définir asar sur false résout le problème, mais il n'est pas recommandé par electron-builder.

Donc, y compris tous les fichiers dont j'ai besoin pour décompresser dans un dossier, et en utilisant "asarUnpack" : "my-folder/*" est la bonne façon. Maintenant, tous les fichiers décompressés sont disponibles dans /resources/app.asar.unpacked/my-folder

Une autre chose à prendre en compte est que l'utilisation du chemin './ResolvePosition.py' va regarder le dossier racine de mon projet d'électrons, pas le chemin où se trouve mon fichier NodeJS, je dois utiliser:

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