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.

fonctionnement de setuptools.find_packages()

+2 votes

Une question revient souvent : "Comment faire un fichier Exe" à partir d'un petit programme, souvent sous pygame.
Voici ci dessous un copié-collé d'un code bien fait (merci Tyrtamos)

#!/usr/bin/python3
# -*- coding: utf-8 -*-


"""
Icone sous Windows: il faut:
=> un xxx.ico pour integration dans le exe, avec "icon=xxx.ico"
=> un xxx.png pour integration avec PyQt4 + demander la recopie avec includefiles.
"""

import sys, os
from cx_Freeze import setup, Executable

#############################################################################
# preparation des options

# chemins de recherche des modules
# ajouter d'autres chemins (absolus) si necessaire: sys.path + ["chemin1", "chemin2"]
path = sys.path

# options d'inclusion/exclusion des modules
includes = []  # nommer les modules non trouves par cx_freeze
excludes = []
packages = []  # nommer les packages utilises

# copier les fichiers non-Python et/ou repertoires et leur contenu:
includefiles = []

if sys.platform == "win32":
    pass
    # includefiles += [...] : ajouter les recopies specifiques à Windows
elif sys.platform == "linux2":
    pass
    # includefiles += [...] : ajouter les recopies specifiques à Linux
else:
    pass
    # includefiles += [...] : cas du Mac OSX non traite ici

# pour que les bibliotheques binaires de /usr/lib soient recopiees aussi sous Linux
binpathincludes = []
if sys.platform == "linux2":
    binpathincludes += ["/usr/lib"]

# niveau d'optimisation pour la compilation en bytecodes
optimize = 0

# si True, n'affiche que les warning et les erreurs pendant le traitement cx_freeze
silent = True

# construction du dictionnaire des options
options = {"path": path,
           "includes": includes,
           "excludes": excludes,
           "packages": packages,
           "include_files": includefiles,
           "bin_path_includes": binpathincludes,
           "create_shared_zip": False,  # <= ne pas generer de fichier zip
           "include_in_shared_zip": False,  # <= ne pas generer de fichier zip
           "compressed": False,  # <= ne pas generer de fichier zip
           "optimize": optimize,
           "silent": silent
           }

# pour inclure sous Windows les dll system de Windows necessaires
if sys.platform == "win32":
    options["include_msvcr"] = True

#############################################################################
# preparation des cibles
base = None
if sys.platform == "win32":
    base = "Win32GUI"  # pour application graphique sous Windows
    # base = "Console" # pour application en console sous Windows

icone = None
if sys.platform == "win32":
    icone = "icone.ico"

cible_1 = Executable(
    script="monprogramme1.pyw",
    base=base,
    compress=False,  # <= ne pas generer de fichier zip
    copyDependentFiles=True,
    appendScriptToExe=True,
    appendScriptToLibrary=False,  # <= ne pas generer de fichier zip
    icon=icone
    )

cible_2 = Executable(
    script="monprogramme2.pyw",
    base=base,
    compress=False,
    copyDependentFiles=True,
    appendScriptToExe=True,
    appendScriptToLibrary=False,
    icon=icone
    )

#############################################################################
# creation du setup
setup(
    name="monprogramme",
    version="1.00",
    description="monprogramme",
    author="auteurduprogramme",
    options={"build_exe": options},
    executables=[cible_1, cible_2]
    )

Chez moi ça marche bien en faisant les ptites modif adéquates. Mais, ceci implique de devoir retoucher le code au cas par cas. Comme je lisais un bon tuto sur Tkinter (http://fsincere.free.fr/isn/python/cours_python_tkinter.php)

je me suis dis que l'allais essayé d'automatiser le truc avec une ptite GUI vite fait bien fait.C'est l'occasion de relire ce qui concerne le path et le cours sur le setup.

MAIS, le cours sur le setup n'est pas adapté à mon petit exemple : je ne vais pas distribuer sur pypy, je veux quelquechose de simple.
Donc ma problematique est de trouver la liste des modules non standards qu'il faudra mettre dans OPTIONS.par exemple pygame .
J'ai fais un mini-fichier setup pour tester le bon fonctionnement, voici:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys, os
import setuptools
import main 

path = sys.path
mesimports = setuptools.find_packages()
print(mesimports)

input("PAUSE - tapez sur espace")

J'obtiens une liste vide ! Pourtant le fichier main, dans le meme repertoire, importe pygame et le jeu marche.
Bref, comment faire pour lister tous les modules et packages non standards, de façon à pouvoir automatiser cx_freeze ?

demandé 15-Mai-2015 par buffalo974 (2,690 points)

yop, j'sais pas trop si c'est ce que tu cherches mais t'as jeté un coup d'oeil ici?

pypy != pypi
:)

C'est quoi un module "non standard" ?

1 Réponse

+2 votes
 
Meilleure réponse

find_package() cherche les packages à partir du dossier courant. Tu peux par ailleurs lui passer un dossier en paramètre comme racine.
Je ne pense pas me tromper en disant que grossièrement, il ne fait que lister les dossiers qui possèdent un init.py, les egg et toutes ces autres conneries.

Ça ne répond pas vraiment à ta question, mais à supposer que tu travailles en python2.7, tu pourrais te tourner vers pyinstaller ou py2exe qui font la recherche de dépendances pour toi.

répondu 16-Mai-2015 par Arza (726 points)
sélectionné 17-Mai-2015 par buffalo974

ça devrait marcher avec nos propres packages donc, je vais essayer ça.

...