py2exe-générer un seul fichier exécutable

j'ai cru entendre que py2exe était capable de le faire, mais je n'ai jamais compris. Quelqu'un a réussi à faire cela? Puis-je voir votre setup.py fichier, et quelles options de ligne de commande vous avez utilisé?

en gros, je pense à me donner un seul fichier exécutable qui se décompose en peut-être / temp et s'exécute.

132
demandé sur Jerub 2008-09-22 04:49:12

9 réponses

PyInstaller va créer un simple .fichier exe sans dépendances; utilisez l'option --onefile . Il le fait en empaquetant tous les libs partagés nécessaires dans l'exécutable, et en les déballant avant qu'il ne démarre, comme vous le décrivez (EDIT: py2exe a aussi cette fonctionnalité, voir réponse de minty )

j'utilise la version de PyInstaller de svn, puisque la dernière version (1.3) est un peu dépassée. Elle fonctionne vraiment bien pour une application qui dépend de PyQt, PyQwt, numpy, scipy et quelques autres.

95
répondu dF. 2017-05-23 12:10:39

la façon de faire ceci en utilisant py2exe est d'utiliser l'option bundle_files dans votre setup.py file. Pour un seul fichier, vous voulez définir bundle_files à 1, compressed à True, et définir L'option zipfile à None. 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 du site py2exe *

à l'Aide de "bundle_files " et" zipfile "

une façon plus facile (et meilleure) de créer seul fichier exécutables est à définir bundle_files à 1 ou 2, et à définir zipfile à Aucun. Cette approche n' pas besoin d'extraire des fichiers vers un emplacement temporaire, qui fournit démarrage beaucoup plus rapide du programme.

valeurs Valides pour bundle_files sont:

  • 3 (par défaut) don't bundle
  • 2 paquets tout sauf l'interprète Python
  • 1 bundle tout, y compris l'interpréteur Python

si zipfile est défini à None, les fichiers seront bundle dans l'exécutable au lieu de la bibliothèque.zip.

voici un échantillon setup.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,
)
165
répondu minty 2012-12-31 18:14:04

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

la prochaine étape est d'utiliser un installateur, pour empaqueter tout cela dans un programme installable/Non installable facile à l'utilisation.

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

13
répondu Philippe F 2008-12-02 09:44:45

vous devez créer un installateur, comme mentionné ci-dessus. Même s'il est également possible de tout regrouper dans un seul exécutable, en définissant l'option bundle_files à 1 et l'argument de mot-clé zipfile à None, Je ne le recommande pas pour les applications PyGTK.

c'est à cause de GTK+ tente de charger ses fichiers de données (locaux, thèmes, etc.) à partir du répertoire, il a été chargé de. Vous devez donc vous assurer que le répertoire de votre exécutable contient aussi les bibliothèques utilisées par GTK+ et les répertoires lib, share et etc de votre installation de GTK+. Dans le cas contraire, vous rencontrerez des problèmes lors de l'exécution de votre application sur une machine où GTK+ n'est pas installé à l'échelle du système.

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

4
répondu Sebastian Noack 2010-09-13 17:40:51

j'ai été capable de créer un seul fichier exe avec toutes les ressources intégrées dans l'exe. Je construis sur les fenêtres. donc ça expliquerait certains os.les appels système 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 causé le dernier exe à être très grand.

après avoir cherché sur Google pendant une semaine, j'ai trouvé comment modifier le script py2exe pour répondre à mes besoins.

voici le lien patch sur sourceforge que j'ai soumis, merci de poster des commentaires afin que nous puissions l'inclure dans la distribution suivante.

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

cela explique tous les changements effectués, 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. S'il vous plaît savoir que mon setup.py est complexe faire au fait que je suis accès aux images par nom de fichier. donc, je dois stocker une liste à garder une trace d'eux.

ça vient d'un économiseur d'écran want-to-b que j'essayais de faire.

j'utilise exec pour générer mon setup à l'exécution, son plus simple pour 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])

ventilation

script = script py je veux tourner vers un exe

icon_resources = l'icône pour l'exe

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

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

options = Options py2exe 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 tant que vous n'avez pas édité votre py2exe.py dossier tel que décrit dans le lien ci-dessus.

première fois que j'ai essayé de poster un 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 bon pour le setup.py maintenant la Magie avait besoin d'accéder aux images. J'ai développé cette application sans py2exe à l'esprit, puis de l'ajouter plus tard. vous verrez donc l'accès pour les deux situations. si le dossier image ne peut pas être trouvé il essaie de tirer les images des ressources exe. le code l'expliquera. ça fait partie de mon cours de sprite. utilise un directx. mais vous pouvez utiliser n'importe quelle api que vous voulez 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 étaient libres de poser.

4
répondu Nor 2011-07-26 03:20:59

je me suis dit bbfreeze va créer un fichier unique .EXE, et est plus récent que py2exe.

1
répondu ℳ  . 2009-02-19 04:02:07

essayer c_x gel il peut créer un bon standalone

-1
répondu Denis 2015-08-04 08:13:18

j'ai récemment utilisé py2exe pour créer un exécutable pour post-review pour envoyer des reviews à ReviewBoard.

C'était le setup.py 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 est possible d'utiliser py2exe pour obtenir un seul .EXE. Si vous en avez besoin, vous devrez d'abord utiliser py2exe puis utiliser une certaine forme d'installateur pour rendre l'exécutable final.

une chose à prendre en charge est que tous les fichiers egg que vous utilisez dans votre application doivent être décompressés, sinon py2exe ne peut pas les inclure. Cette question est traitée dans les documents py2exe.

-2
répondu David Dibben 2008-09-22 00:56:28

Non, il ne vous donne pas un seul exécutable dans le sens où vous n'avez qu'un seul 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 setup.py aujourd'hui. Il suffit d'invoquer python setup.py py2exe .

-5
répondu Torsten Marek 2008-09-22 00:53:21