python setuptools distutils distribute setup.py

¿Por qué "python setup.py sdist" crea un "PROJECT-egg.info" no deseado en el directorio raíz del proyecto?



setuptools distutils (4)

Cuando corro

python setup.py sdist

crea un sdist en mi directorio ./dist. Esto incluye un archivo "PROJECT-egg.info" en el zip dentro de mi carpeta "dist", que no uso, pero no me duele, así que simplemente lo ignoro.

Mi pregunta es ¿por qué también crea una carpeta "PROJECT-egg.info" en el directorio raíz de mi proyecto? ¿Puedo hacer que deje de crear esto? Si no, ¿puedo simplemente eliminarlo inmediatamente después de crear el sdist?

Estoy usando la función ''configuración'' importada desde setuptools. WindowsXP, Python2.7, Setuptools 0.6c11, Distribuir 0.6.14.

Mi configuración de configuración se ve así:

{''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}


El sistema de empaquetado y construcción de pitones se rompe en mi humilde opinión. Entonces, hay muchos hacks y soluciones para cosas que uno cree que funcionan de la caja.

Sin embargo, el truco "más limpio" que encontré para eliminar el * .egg-info es usar el clean --all normal clean --all interruptor junto con el egg_info para colocar el archivo * .egg-info en una subcarpeta que se limpiará con el comando limpiar . Aquí un ejemplo:

En su setup.cfg use algo como esto:

[egg_info] egg_base = ./build/lib

donde ./build/lib es una carpeta que se clean --all se eliminarán. Luego, cuando construyas tu proyecto con las herramientas de configuración, utiliza el comando limpiar con la marca --toda, por ejemplo

python setup.py bdist_wheel clean --all

si también desea compilar un paquete fuente, asegúrese de compilar bdist_wheel antes de sdist para que exista la carpeta compilación / lib, por ejemplo:

python setup.py bdist_wheel sdist clean --all


Este directorio se crea intencionalmente como parte del proceso de compilación para una distribución fuente. Un pequeño vistazo a la guía del desarrollador para setuptools le da una pista de por qué:

Pero, asegúrese de ignorar cualquier parte de la documentación de distutils que trate con MANIFEST o cómo se genera desde MANIFEST.in; setuptools lo protege de estos problemas y no funciona de la misma manera en ningún caso. A diferencia de los distutils, setuptools regenera el archivo de manifiesto de distribución de origen cada vez que compila una distribución de origen, y lo construye dentro del directorio .egg-info del proyecto, fuera del camino del directorio de su proyecto principal. Por lo tanto, no necesita preocuparse por si está actualizado o no.

Puede eliminar el directorio de forma segura después de que se haya completado su compilación.

Edición de bonificación:

Personalizo el comando clean en mi setup.py en muchos de mis proyectos de Python para eliminar *.egg-info , dist , build y *.pyc y otros archivos. Aquí hay un ejemplo de cómo se hace en 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, } )

Para ilustrar, después de ejecutar python setup.py build en un proyecto ficticio llamado "poop" (Sí, estoy muy maduro), esto sucede:

$ 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

Y ahora si ejecutamos 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!


La carpeta -egg.info no siempre es un artefacto temporal que puede eliminar.

Por ejemplo, si usa pip install -e YOURPACKAGE para una instalación "editable" (funciona a través de symlink como python setup.py develop para que no tenga que volver a instalar un paquete cada vez que lo edite localmente), el -egg.info Se requiere una carpeta -egg.info en tiempo de ejecución cuando su paquete se importa en otra fuente. Si no existe, obtendrá un error de DistributionNotFound .


Tenga en cuenta que puede hacer que los artefactos PROJECT.egg-info desaparezcan por completo de su sdist.

El comando setup.py egg_info usará la raíz de origen como la base de huevo de forma predeterminada, lo que PROJECT.egg-info resultado que el directorio PROJECT.egg-info se empaquete en el sdist.

Puede configurar la base de huevo pasando la opción --egg-base . Esto creará el directorio PROJECT.egg-info en otro lugar, dejándolo fuera de la distribución de su fuente por completo. También puede usar setup.cfg para establecer esa propiedad.

El siguiente comando para crear un sdist sin un PROJECT.egg-info funciona para mí:

python setup.py egg_info --egg-base /tmp sdist

O en un setup.cfg :

[egg_info] egg_base = /tmp