Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Windows service en python compilation nuitka

0 votes

Je coince sur la creation d'un windows service en python et sa compilation en .exe
J'utilise pypiwin32, python36 64bit.

Les liens vers les 2 fichiers code sources :
files

logs_winserv.py (template du service)
logs_omnisens (outils de logs mais à terme vrai code du service)

je recupere dans logs_winserv.py le chemin de mon script avec __file__
tant que le script n'est pas compilé je peux installer / déplacer mes fichiers python mon service fonctionne et __file__ pointe vers le bon endroit.

Lorsque je compile avec nuitka en incluant uniquement mes fichiers (pas les libs) __file__ pointe toujours vers le dossier source de mon script utilisé pour la compilation et non plus l'endroit physique ?

De plus si je supprime / renomme /deplace les fichiers .py le service compilé ne fonctionne pas. Les .py doivent etre present dans le dossier source. Ce qui n'est clairement pas le but recherché.

si j'enleve les fichiers .py lors de l'execution j'ai l'erreur:

Python could not import the service's module  ModuleNotFoundError: No module named 'logs_winserv' 

alors que logs_winserv est le fichier compilé !

J'ai du foirer qqchose mais je ne comprends pas quoi.

ligne de compilation :

nuitka --recurse-to=logs_omnisens logs_winserv.py 

j'ai commenté le bout de code dont je me sers pour le debug car il pointe vers un lien en dur C:\dev\
pour tester le code python une fois pypiwin32 installé:
python logs_winserv.py install
puis net start omnisenslogs
cela cree un dossier logs dans le dossier courant qui loggent les itérations et start /stop

au début du script j'utilise

os.chdir(os.path.dirname(os.path.abspath(__file__)))
cst_working_dir = os.path.dirname(os.path.abspath(__file__))

pour justement me placer dans le dossier courant de l'appel du script cela semble etre une source des problemes entre le mode script et le mode compilé. Mais impossible de solutionner cette histoire avec mes connaissance.

demandé 19-Oct par cnaimi (104 points)

1 Réponse

0 votes

au début du script j'utilise

os.chdir(os.path.dirname(os.path.abspath(__file__)))
cst_working_dir = os.path.dirname(os.path.abspath(__file__))

pour justement me placer dans le dossier courant de l'appel du script cela semble etre une source des problemes entre le mode script et le mode compilé. Mais impossible de solutionner cette histoire avec mes connaissance.

Si ce que tu veux est vraiment de te "placer dans le dossier courant de l'appel du script ", alors pas besoin d'utiliser __file__.
Avec __file__, tu récupères l'emplacement du fichier de script, pas l'emplacement depuis où est fait l'appel.

Donc si c'est l'emplacement d'appel qui t'intéresse, enlèves les référence à __file__ et avec un peu de chance ton problème de compilation disparaîtra aussi.

répondu 19-Oct par bubulle (2,066 points)

J'utilise __file__ car os.path.getcwd() ne renvoi le "vrai" dossier du script (la ou je veux mettre mes logs par exemple ou lire un .cfg) uniquement lors de la commande install du service
lors du "Run/start" du service le dossier courant est alors C:\python\lib\site-packages/win32/ car c'est la que ce trouve pythonservices.exe qui fait le management du service avec le framework de pypiwin32

cette dualité de dossier entre le moment de l'install du service et du run est compréhensible mais chiante a gerer.

En mode python le code fourni fonctionne n'importe ou!

Cet apres-midi j'ai réussi à faire fonctionner en compilant en mode module et en mode .exe. Mais depuis j'ai pété un truc la version compilé ne s'installe meme plus en tant que service j'ai une erreur dans le framework pypiwin32.

ok, c'est bien l'emplacement du script qui t'intéresse ici, pas celui de l'appel, donc ma proposition ne va pas t'aider.

Peut-être qu'en faisant comme ça:

import sys, os
script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))

plutôt que de compter sur __file__ ?

...