Question

Je pensais avoir entendu dire que py2exe était capable de le faire, mais je ne l'ai jamais compris. Quelqu'un at-il réussi à faire cela? Puis-je voir votre fichier setup.py et quelles options de ligne de commande vous avez utilisées?

En gros, je songe à me donner un seul fichier exécutable qui se décompresse comme par exemple se décompresse en peut-être / temp et s'exécute.

Était-ce utile?

La solution

PyInstaller créera un seul fichier .exe sans dépendance. utilisez l'option - onefile . Pour ce faire, il stocke toutes les bibliothèques partagées nécessaires dans l'exécutable et les décompresse avant son exécution, comme vous le décrivez (EDIT: py2exe a également cette fonctionnalité, voir La réponse de menthe )

J'utilise la version de PyInstaller de svn, car la dernière version (1.3) est quelque peu obsolète. Cela fonctionne très bien pour une application qui dépend de PyQt, PyQwt, Numpy, Scipy et quelques autres.

Autres conseils

Pour utiliser py2exe, utilisez l’option bundle_files de votre fichier setup.py. Pour un fichier unique, définissez bundle_files sur 1, compressé sur True et définissez l'option zipfile sur Aucun. De cette façon, il crée un fichier compressé pour une distribution facile.

Voici une description plus complète de l'option bundle_file citée directement à partir de site py2exe *

  

Utilisation de " bundle_files " et "zipfile"

     

Un moyen plus simple (et meilleur) de créer   exécutables mono-fichier est de définir   bundle_files à 1 ou 2, et à définir   zipfile to None. Cette approche ne   pas besoin d'extraire des fichiers à un   emplacement temporaire, qui fournit   démarrage beaucoup plus rapide du programme.

     

Les valeurs valides pour bundle_files sont:

     
      
  • 3 (par défaut) ne pas grouper
  •   
  • 2 bundle tout sauf l'interpréteur Python
  •   
  • 1 tout regrouper, y compris l'interpréteur Python
  •   
     

Si zipfile est défini sur None, les fichiers seront regroupés.   dans l'exécutable au lieu de library.zip.

Voici un exemple d'installation.py:

from distutils.core import setup
import py2exe, sys, os

sys.argv.append('py2exe')

setup(
    options = {'py2exe': {'bundle_files': 1, 'compressed': True}},
    windows = [{'script': "single.py"}],
    zipfile = None,
)

Comme l’autre mention de l’affiche, py2exe, générera un exécutable + quelques bibliothèques à charger. Vous pouvez également avoir des données à ajouter à votre programme.

L’étape suivante consiste à utiliser un programme d’installation pour regrouper tout cela dans un programme facile à utiliser, installable / non instable.

J'ai utilisé InnoSetup ( http://www.jrsoftware.org/isinfo.php . ) avec plaisir depuis plusieurs années et pour les programmes commerciaux, je le recommande donc vivement.

Vous devez créer un programme d’installation, comme mentionné précédemment. Même s'il est également possible de laisser py2exe regrouper tout dans un seul exécutable, en définissant l'option bundle_files sur 1 et l'argument de mot-clé zipfile sur Aucun, je ne le recommande pas pour les applications PyGTK.

C’est parce que GTK + essaie de charger ses fichiers de données (sections locales, thèmes, etc.) à partir du répertoire à partir duquel il a été chargé. Vous devez donc vous assurer que le répertoire de votre exécutable contient également les bibliothèques utilisées par GTK + et les répertoires lib, share, etc. de votre installation de GTK +. Sinon, vous rencontrerez des problèmes lors de l’exécution de votre application sur une machine sur laquelle GTK + n’est pas installé à l’échelle du système.

Pour plus de détails, consultez mon guide de py2exe pour les applications PyGTK . Il explique également comment tout regrouper, sauf GTK +.

J'ai pu créer un seul fichier exe avec toutes les ressources incorporées dans l'exe. Je construis sur des fenêtres. donc ça va expliquer certains des appels os.system que j'utilise.

J'ai d'abord essayé de convertir toutes mes images en bitmats, puis tous mes fichiers de données en chaînes de texte. mais cela a rendu l'exe final très très volumineux.

Après une semaine de recherches sur Google, j'ai trouvé comment modifier le script py2exe pour répondre à mes besoins.

voici le lien du correctif sur sourceforge i soumis, merci de poster vos commentaires pour que nous puissions l'inclure dans la prochaine distribution.

http://sourceforge.net/tracker/index. php? func = detail & amp = 3334760 & group_id = 15583 & atid = 315583

Ceci explique toutes les modifications apportées. J'ai simplement ajouté une nouvelle option à la ligne de configuration. voici mon setup.py.

Je vais essayer de commenter du mieux que je peux. Sachez que mon setup.py est complexe, car je peux accéder aux images par nom de fichier. je dois donc stocker une liste pour en garder trace.

il s'agit d'un économiseur d'écran voulu que j'essayais de créer.

J'utilise exec pour générer ma configuration au moment de l'exécution. Il est plus facile de couper et coller comme ça.

exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\
      'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\
      options={'py2exe': py2exe_options},\
      zipfile = None )" % (bitmap_string[:-1])

panne

script = py script je veux me tourner vers un exe

icon_resources = l'icône pour l'exe

file_resources = fichiers que je veux intégrer à l'exe

other_resources = une chaîne à intégrer à l'exe, dans ce cas une liste de fichiers.

options = py2exe options pour tout créer dans un fichier exe

bitmap_strings = une liste de fichiers à inclure

Veuillez noter que file_resources n'est pas une option valide jusqu'à ce que vous modifiiez votre fichier py2exe.py comme décrit dans le lien ci-dessus.

La première fois que j'essaye de poster du code sur ce site, si je me trompe, ne me flambe pas.

from distutils.core import setup
import py2exe #@UnusedImport
import os

#delete the old build drive
os.system("rmdir /s /q dist")

#setup my option for single file output
py2exe_options = dict( ascii=True,  # Exclude encodings
                       excludes=['_ssl',  # Exclude _ssl
                                 'pyreadline', 'difflib', 'doctest', 'locale',
                                 'optparse', 'pickle', 'calendar', 'pbd', 'unittest', 'inspect'],  # Exclude standard library
                       dll_excludes=['msvcr71.dll', 'w9xpopen.exe',
                                     'API-MS-Win-Core-LocalRegistry-L1-1-0.dll',
                                     'API-MS-Win-Core-ProcessThreads-L1-1-0.dll',
                                     'API-MS-Win-Security-Base-L1-1-0.dll',
                                     'KERNELBASE.dll',
                                     'POWRPROF.dll',
                                     ],
                       #compressed=None,  # Compress library.zip
                       bundle_files = 1,
                       optimize = 2                        
                       )

#storage for the images
bitmap_string = '' 
resource_string = ''
index = 0

print "compile image list"                          

for image_name in os.listdir('images/'):
    if image_name.endswith('.jpg'):
        bitmap_string += "( " + str(index+1) + "," + "'" + 'images/' + image_name + "'),"
        resource_string += image_name + " "
        index += 1

print "Starting build\n"

exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\
      'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\
      options={'py2exe': py2exe_options},\
      zipfile = None )" % (bitmap_string[:-1])

print "Removing Trash"
os.system("rmdir /s /q build")
os.system("del /q *.pyc")
print "Build Complete"

ok, c’est tout pour le setup.py maintenant la magie nécessaire accéder aux images. J'ai développé cette application sans py2exe à l'esprit, puis je l'ai ajoutée plus tard. vous verrez donc un accès pour les deux situations. si le dossier de l'image est introuvable il essaie de tirer les images des ressources exe. le code l'expliquera. cela fait partie de ma classe sprite et utilise un directx. mais vous pouvez utiliser n'importe quelle api ou simplement accéder aux données brutes. n'a pas d'importance.

def init(self):
    frame = self.env.frame
    use_resource_builtin = True
    if os.path.isdir(SPRITES_FOLDER):
        use_resource_builtin = False
    else:
        image_list = LoadResource(0, u'INDEX', 1).split(' ')

    for (model, file) in SPRITES.items():
        texture = POINTER(IDirect3DTexture9)()
        if use_resource_builtin: 
            data = LoadResource(0, win32con.RT_RCDATA, image_list.index(file)+1) #windll.kernel32.FindResourceW(hmod,typersc,idrsc)               
            d3dxdll.D3DXCreateTextureFromFileInMemory(frame.device,   #Pointer to an IDirect3DDevice9 interface
                                              data,                #Pointer to the file in memory
                                              len(data),           #Size of the file in memory
                                              byref(texture))      #ppTexture
        else:
            d3dxdll.D3DXCreateTextureFromFileA(frame.device, #@UndefinedVariable
                                               SPRITES_FOLDER + file,
                                               byref(texture))            
        self.model_sprites[model] = texture
    #else:
    #    raise Exception("'sprites' folder is not present!")

Toutes les questions ne posaient pas de problèmes.

On m'a dit que bbfreeze créera un fichier .EXE unique, qui est plus récent. que py2exe.

essayer c_x freeze il peut créer un bon autonome

J'ai récemment utilisé py2exe pour créer un fichier exécutable à posteriori pour l'envoi de révisions à ReviewBoard.

C’est le setup.py que j’ai utilisé

from distutils.core import setup
import py2exe

setup(console=['post-review'])

Il a créé un répertoire contenant le fichier exe et les bibliothèques nécessaires. Je ne pense pas qu'il soit possible d'utiliser py2exe pour obtenir un seul fichier .exe. Si vous en avez besoin, vous devrez d’abord utiliser py2exe, puis utiliser une forme d’installateur pour rendre le fichier exécutable final.

Une chose à faire est que tous les fichiers d'oeufs que vous utilisez dans votre application doivent être décompressés, sinon py2exe ne peut pas les inclure. Ceci est couvert dans la documentation py2exe.

Non, cela ne vous donne pas un seul exécutable dans le sens où vous n’avez plus qu’un fichier par la suite, mais vous avez un répertoire qui contient tout ce dont vous avez besoin pour exécuter votre programme, y compris un fichier exe.

Je viens d'écrire cette configuration.py aujourd'hui. Vous devez uniquement appeler python setup.py py2exe .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top