web-dev-qa-db-fra.com

Pourquoi "Python Setup.py Sdist" crée-t-il des "Project-egg.info" non désirés dans le répertoire racine du projet?

Quand je cours

  python setup.py sdist

cela crée un sdist dans mon ./dist Directory. Cela inclut un fichier "projet-egg.info" dans la fermeture à glissière dans mon dossier "dist", que je n'utilise pas, mais ça ne me fait pas mal, alors je l'ignore.

Ma question est pourquoi -aussi Créer un dossier "Project-EGG.info" dans mon répertoire racine de projet? Puis-je le faire arrêter de créer ceci? Sinon, puis-je simplement le supprimer immédiatement après avoir créé le SDist?

J'utilise la fonction "Configuration" importée de SourissoTools. WindowsXP, Python2.7, SeugoTools 0.6C11, Distribuez 0.6.14.

Ma configuration de configuration ressemble à:

{'author': 'Jonathan Hartley',
 'author_email': '[email protected]',
 'classifiers': ['Development Status :: 1 - Planning',
                 'Intended Audience :: Developers',
                 'License :: OSI Approved :: BSD License',
                 'Operating System :: Microsoft :: Windows',
                 'Programming Language :: Python :: 2.7'],
 'console': [{'script': 'demo.py'}],
 'data_files': [('Microsoft.VC90.CRT',
                 ['..\\lib\\Microsoft.VC90.CRT\\Microsoft.VC90.CRT.manifest',
                  '..\\lib\\Microsoft.VC90.CRT\\msvcr90.dll'])],
 'description': 'Utilities for games and OpenGL graphics, built around Pyglet.\n',
 'keywords': '',
 'license': 'BSD',
 'long_description': "blah blah blah",
 'name': 'pygpen',
 'options': {'py2exe': {'ascii': True,
                        'bundle_files': 1,
                        'dist_dir': 'dist/pygpen-0.1-windows',
                        'dll_excludes': [],
                        'excludes': ['_imaging_gif',
                                     '_scproxy',
                                     'clr',
                                     'dummy.Process',
                                     'email',
                                     'email.base64mime',
                                     'email.utils',
                                     'email.Utils',
                                     'ICCProfile',
                                     'Image',
                                     'IronPythonConsole',
                                     'modes.editingmodes',
                                     'startup',
                                     'System',
                                     'System.Windows.Forms.Clipboard',
                                     '_hashlib',
                                     '_imaging',
                                     '_multiprocessing',
                                     '_ssl',
                                     '_socket',
                                     'bz2',
                                     'pyexpat',
                                     'pyreadline',
                                     'select',
                                     'win32api',
                                     'win32pipe',
                                     'calendar',
                                     'cookielib',
                                     'difflib',
                                     'doctest',
                                     'locale',
                                     'optparse',
                                     'pdb',
                                     'pickle',
                                     'pyglet.window.xlib',
                                     'pyglet.window.carbon',
                                     'pyglet.window.carbon.constants',
                                     'pyglet.window.carbon.types',
                                     'subprocess',
                                     'tarfile',
                                     'threading',
                                     'unittest',
                                     'urllib',
                                     'urllib2',
                                     'win32con',
                                     'zipfile'],
                        'optimize': 2}},
 'packages': ['pygpen'],
 'scripts': ['demo.py'],
 'url': 'http://code.google.com/p/edpath/',
 'version': '0.1',
 'zipfile': None}
49
Jonathan Hartley

Ce répertoire est créé intentionnellement dans le cadre du processus de construction d'une distribution source. Un peu de glandes au Guide du développeur pour seugoTools vous donne un indice pourquoi:

Mais assurez-vous d'ignorer toute partie de la documentation des distutilles qui traite du manifeste ou de la manière dont elle est générée à partir de manifeste.in; SeugoTools vous protège de ces problèmes et ne fonctionne pas de la même manière. Contrairement aux distutils, SetUpoTools régénère le fichier manifeste de la distribution source chaque fois que vous créez une distribution de source, et il le construit à l'intérieur du répertoire du projet .EGG-info, en dehors de votre répertoire de projet principal. Vous n'avez donc pas besoin de ne pas vous inquiéter de savoir s'il est à jour ou non.

Vous pouvez supprimer en toute sécurité le répertoire une fois votre construction terminée.

Bonus Modifier:

Je personnalise la commande clean dans mon setup.py sur beaucoup de my Python projets à supprimer *.Egg-info, dist, build, et *.pyc et autres fichiers. Voici un exemple de la façon dont cela se fait dans setup.py:

import os
from setuptools import setup, Command

class CleanCommand(Command):
    """Custom clean command to tidy up the project root."""
    user_options = []
    def initialize_options(self):
        pass
    def finalize_options(self):
        pass
    def run(self):
        os.system('rm -vrf ./build ./dist ./*.pyc ./*.tgz ./*.Egg-info')

# Further down when you call setup()
setup(
    # ... Other setup options
    cmdclass={
        'clean': CleanCommand,
    }
)

Illustrer, après avoir exécuté python setup.py build sur un projet factice appelé "Poop" (oui, je suis très mature), cela se produit:

$ python setup.py build
running build
running build_py
creating build
creating build/lib
creating build/lib/poop
copying poop/__init__.py -> build/lib/poop

Et maintenant si nous courons python setup.py clean:

$ python setup.py clean
running clean
removed `./build/lib/poop/__init__.py'
removed directory: `./build/lib/poop'
removed directory: `./build/lib'
removed directory: `./build'

Tada!

53
jathanism

Les -Egg.info Dossier n'est pas toujours un artefact temporaire que vous pouvez supprimer.

Par exemple, si vous utilisez pip install -e YOURPACKAGE Pour une installation "modifiable" (fonctionne via Symlink comme python setup.py develop Vous n'avez donc pas à ré-installer un package à chaque fois que vous le modifiez localement), le -Egg.info Dossier est requis au moment de l'exécution lorsque votre colis est importé dans une autre source. Si cela n'existe pas, vous obtiendrez une erreur DistributionNotFound.

16
Chris Johnson

Notez que vous pouvez avoir le PROJECT.Egg-info Les artefacts disparaissent complètement de votre sdist.

La commande setup.py Egg_info utilisera la racine de source comme base d'œufs par défaut, ce qui permettra à la PROJECT.Egg-info répertoire étant emballé dans le SDist.

Vous pouvez configurer l'oeuf de base en passant l'option --Egg-base. Cela créera le PROJECT.Egg-info Annuaire ailleurs, le laissant hors de votre distribution source complètement. Vous pouvez également utiliser un setup.cfg Pour définir cette propriété.

La commande suivante pour créer un sdist sans PROJECT.Egg-info travaille pour moi:

python setup.py Egg_info --Egg-base /tmp sdist

Ou dans un setup.cfg:

[Egg_info]
Egg_base = /tmp
10
user245678

Les pythes emballage et le système de construction sont cassés IMHO. Donc, il y a beaucoup de hacks et de solutions de contournement pour les choses que l'on voudrait bien travailler de la boîte.

Cependant, le piratage "plus propre" que j'ai trouvé pour supprimer le * .Egg-info utilise la normale clean --all commutateur avec le Egg_info Pour placer le fichier * .EGG-info dans un sous-dossier qui sera nettoyé par la commande Netty. Voici un exemple:

Dans ton setup.cfg Utilisez quelque chose comme ceci:

[Egg_info]
Egg_base = ./build/lib

./build/lib est un dossier que clean --all supprimera. Ensuite, lorsque vous construisez votre projet avec SetOpTools, utilisez la commande propre avec le drapeau --all, par exemple.

python setup.py bdist_wheel clean --all

si vous souhaitez construire un ensemble source également, assurez-vous de construire BDist_wheel avant SDist, le dossier Build/Lib existe, E.G.:

python setup.py bdist_wheel sdist clean --all

1
masi