Почему «python setup.py sdist» создает нежелательный «PROJECT-egg.info» в корневом каталоге проекта? - PullRequest
44 голосов
/ 23 сентября 2010

Когда я запускаю

  python setup.py sdist

, он создает sdist в моем каталоге ./dist.Это включает в себя файл "PROJECT-egg.info" в zip внутри моей папки "dist", который я не использую, но это не повредит мне, поэтому я просто игнорирую его.почему также создает папку «PROJECT-egg.info» в корневом каталоге моего проекта?Могу ли я заставить это прекратить создавать это?Если нет, могу ли я просто удалить его сразу после создания sdist?

Я использую функцию 'setup', импортированную из setuptools.WindowsXP, Python2.7, Setuptools 0.6c11, Distribute 0.6.14.

Моя конфигурация установки выглядит так:

{'author': 'Jonathan Hartley',
 'author_email': 'tartley@tartley.com',
 '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}

Ответы [ 4 ]

53 голосов
/ 23 сентября 2010

Этот каталог специально создан как часть процесса сборки для исходного дистрибутива.Небольшое руководство в руководстве разработчика для setuptools дает подсказку о том, почему:

Но не забудьте игнорировать любую часть документации distutils, касающуюся MANIFEST или какгенерируется из MANIFEST.in;setuptools защищает вас от этих проблем и не работает в любом случае.В отличие от distutils, setuptools регенерирует файл манифеста исходного распределения каждый раз, когда вы создаете исходный дистрибутив, и создает его в каталоге проекта .egg-info, а не в каталоге вашего основного проекта.Поэтому вам не нужно беспокоиться о том, актуальна ли она.

Вы можете безопасно удалить каталог после завершения сборки.

Бонусное редактирование:

Я настраиваю команду clean в моем setup.py во многих моих проектах Python для удаления *.egg-info, dist, build и *.pyc и других файлов.Вот пример того, как это делается в 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,
    }
)

Чтобы проиллюстрировать, после запуска python setup.py build в фиктивном проекте под названием «poop» (да, я очень зрелый), это происходит:

$ 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

А теперь, если мы запустим 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'

Тада!

15 голосов
/ 12 января 2016

Папка -egg.info не всегда является временным артефактом, который вы можете удалить.

Например, если вы используете pip install -e YOURPACKAGE для «редактируемой» установки (работает через символьную ссылку, например python setup.py develop, так что выне нужно переустанавливать пакет каждый раз, когда вы редактируете его локально), папка -egg.info требуется во время выполнения, когда ваш пакет импортируется из другого источника.Если его не существует, вы получите ошибку DistributionNotFound.

9 голосов
/ 09 июня 2014

Обратите внимание, что артефакты PROJECT.egg-info могут полностью исчезнуть из вашего sdist.

Команда setup.py egg_info будет использовать исходный корень в качестве основы для яиц по умолчанию, в результате каталог PROJECT.egg-info будет упакован в sdist.

Вы можете настроить подставку для яиц, передав опцию --egg-base. Это создаст каталог PROJECT.egg-info в другом месте, полностью исключив его из исходного дистрибутива. Вы также можете использовать setup.cfg для установки этого свойства.

Следующая команда для создания sdist без PROJECT.egg-info работает для меня:

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

Или в setup.cfg:

[egg_info]
egg_base = /tmp
1 голос
/ 16 августа 2018

Система упаковки и сборки Pythons не работает imho.Таким образом, существует множество хаков и обходных путей для вещей, которые можно поверить в работу «из коробки».

Однако самый «чистый» хак, который я нашел для удаления * .egg-info, использует обычный переключатель clean --allвместе с egg_info, чтобы поместить файл * .egg-info в подпапку, которая будет очищена командой clean.Вот пример:

В вашем setup.cfg используйте что-то вроде этого:

[egg_info]
egg_base = ./build/lib

, где ./build/lib - папка, которую clean --all удалит.Затем при сборке проекта с помощью setuptools используйте команду clean с флагом --all, например,

python setup.py bdist_wheel clean --all

, если вы также хотите собрать исходный пакет, просто убедитесь, что вы собрали bdist_wheelперед sdist, поэтому существует папка build / lib, например:

python setup.py bdist_wheel sdist clean --all

...