3 votes

Comment utiliser PyInstaller à partir de script, et non du terminal ?

Version courte :

Comment utiliser PyInstaller à partir d'un script Python, plutôt qu'à partir du terminal ?

Que devrais-je écrire à l'intérieur d'un script Python pour obtenir l'équivalent d'écrire ceci dans le terminal :

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py

Version longue :

J'utilise une bibliothèque qui nécessite l'utilisation de PyInstaller pour distribuer un exécutable. Mais je dois exécuter PyInstaller une fois, puis modifier les fichiers de spécification, puis exécuter le fichier de spécification via PyInstaller.

Donc dans le terminal, j'aurais fait ça :

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py

Une fois l'exécution terminée, je modifie manuellement le fichier spec. Puis j'exécute :

>python -m PyInstaller WorkLogger.spec

J'ai écrit un script qui fait le travail manuel pour moi, en exécutant

>change_spec.py

Mais je veux finalement faire tout cela dans un script Python. Je veux être capable de taper quelque chose comme ça :

>distribute_python_project.py ./Worklogger

Cela signifie que mon script Python devrait ressembler à quelque chose comme ceci :

#Psuedocode:
#python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py
#Code from change_spec.py
#python -m PyInstaller WorkLogger.spec

Mais je n'arrive pas à comprendre comment utiliser PyInstaller à partir d'un script python, plutôt que depuis le terminal. Est-ce possible ? (La bibliothèque que j'utilise est Kivy, pour ceux qui sont intéressés).

5voto

Einar Points 584

Merci à l'employé et à Canh ! Preuve de concept fonctionnelle :

Terminal :

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py

Python script :

subprocess.call(r"python -m PyInstaller --noconsole --name WorkLogger F:\KivyApps\WorkLogger\main.py")

Si nécessaire, vous pouvez démarrer le sous-processus à partir d'un répertoire de travail spécifique :

subprocess.call(r"python -m PyInstaller --noconsole --name WorkLogger F:\KivyApps\WorkLogger\main.py", cwd=r"F:\KivyApps\WorkLogger_Dist")

4voto

Berniiiii Points 81

Vous pouvez même accéder directement au module de PyInstaller en utilisant le fichier spec si vous le souhaitez. Dans cet exemple, ceci avec différents emplacements du fichier spec, dist-dir et build-dir.

import PyInstaller

# my spec file in "dev\config" dir
workdir = os.getcwd()
fn_msi_spec = os.path.join(workdir, 'main_msi.spec')

# define the "dev\dist" and "dev\build" dirs
os.chdir("..")
devdir = os.getcwd()
distdir = os.path.join(devdir, 'dist')
builddir = os.path.join(devdir, 'build')

# call pyinstaller directly
PyInstaller.__main__.run(['--distpath', distdir, '--workpath', builddir, fn_msi_spec])

1voto

coder Points 309

La réponse de Berniiiii était correcte mais n'allait pas droit au but et je l'ai personnellement trouvée un peu confuse.

Voici une réponse tirée de la documentation officielle : exécuter-pyinstaller-à-partir-du-code-python

import PyInstaller.__main__

PyInstaller.__main__.run([
    'my_script.py',
    '--onefile',
    '--windowed'
])

Est équivalent à :

pyinstaller my_script.py --onefile --windowed

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X