Je suis confronté à ce problème depuis longtemps, très long) temps. J'ai cherché dans presque toutes les sources mais les choses ne se mettaient pas en place dans ma tête.
Enfin, je pense avoir trouvé les étapes exactes à suivre, je voulais partager.
Notez que, ma réponse utilise des informations sur les réponses des autres sur cette question.
Comment créer un exécutable autonome d'un projet python.
Supposons que nous ayons un dossier de projet et que l'arbre des fichiers soit le suivant :
project_folder/
main.py
xxx.py # another module
yyy.py # another module
sound/ # directory containing the sound files
img/ # directory containing the image files
venv/ # if using a venv
Tout d'abord, disons que vous avez défini vos chemins pour sound/
y img/
dossiers dans des variables sound_dir
y img_dir
comme suit :
img_dir = os.path.join(os.path.dirname(__file__), "img")
sound_dir = os.path.join(os.path.dirname(__file__), "sound")
Vous devez les modifier, comme suit :
img_dir = resource_path("img")
sound_dir = resource_path("sound")
Où, resource_path()
est défini en haut de votre script comme :
def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
return os.path.join(base_path, relative_path)
Activez l'environnement virtuel si vous utilisez un venv,
Installez pyinstaller si vous ne l'avez pas encore fait, par : pip3 install pyinstaller
.
Cours : pyi-makespec --onefile main.py
pour créer le fichier spec pour le processus de compilation et de construction.
Cela changera la hiérarchie des fichiers en :
project_folder/
main.py
xxx.py # modules
xxx.py # modules
sound/ # directory containing the sound files
img/ # directory containing the image files
venv/ # if using a venv
main.spec
Ouvert (avec un édile) main.spec
:
En haut, insérer :
added_files = [
("sound", "sound"),
("img", "img")
]
Ensuite, modifiez la ligne de datas=[],
a datas=added_files,
Pour le détail des opérations effectuées sur main.spec
voir ici.
Exécuter pyinstaller --onefile main.spec
Et c'est tout, vous pouvez courir main
en project_folder/dist
de n'importe où, sans avoir rien d'autre dans son dossier. Vous ne pouvez distribuer que ce main
fichier. C'est maintenant, un véritable autonome .
11 votes
Merci beaucoup ! la ligne ici (
a.datas += ...
) m'a vraiment aidé à l'instant. La documentation de pyinstaller parle de l'utilisation deCOLLECT
mais cela ne permet pas de mettre les fichiers dans le binaire lorsque l'on utilise--onefile
0 votes
@IgorSerebryany : Je suis d'accord ! Je viens d'avoir exactement le même problème.
0 votes
Mon .exe se plante lorsque je clique sur la barre de menu si j'ai utilisé
1 votes
Tenez compte du fait que le dossier temporaire disparaît à la fin de l'exécution, donc pour vérifier ce qu'il contient, mettez un listdir de sys._MEIPASS dans votre programme. principal
0 votes
Existe-t-il également un moyen d'utiliser la syntaxe Tree() que je semble avoir vue un peu partout ?