为什么“python setup.py sdist”会在项目根目录中创建不需要的“PROJECT-egg.info”?

时间:2010-09-23 15:26:02

标签: python setuptools distutils distribute setup.py

当我跑步时

  python setup.py sdist

它在我的./dist目录中创建了一个sdist。这包括我的“dist”文件夹中拉链中的“PROJECT-egg.info”文件,我没有使用它,但它不会伤害我,所以我只是忽略它。

我的问题是为什么在我的项目根目录中创建一个“PROJECT-egg.info”文件夹?我可以让它停止创建吗?如果没有,我可以在创建sdist后立即删除它吗?

我正在使用从setuptools导入的'setup'功能。 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 个答案:

答案 0 :(得分:52)

此目录是有意创建的,作为源代码分发的构建过程的一部分。 developer guide for setuptools的一个小勇士会给你一个暗示:

  

但是,请务必忽略其中的任何部分   distutils交易的文件   使用MANIFEST或它是如何生成的   来自MANIFEST.in; setuptools盾牌   你从这些问题,但不起作用   在任何情况下都是一样的。不像   distutils,setuptools重新生成   源分发清单文件   每次构建源代码   分发,并在内部构建它   项目的.egg-info目录,out   你的主要项目的方式   目录。因此你不需要   担心它是否是最新的   或不。

您可以在构建完成后安全地删除目录。

奖金编辑:

我在我的clean中为我的许多Python项目自定义setup.py命令,以删除*.egg-infodistbuild和{{1}和其他文件。以下是*.pyc中如何完成的示例:

setup.py

为了说明,在一个名为“poop”的虚拟项目上运行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

现在如果我们运行$ 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

多田!

答案 1 :(得分:14)

pip install -e YOURPACKAGE文件夹并不总是您可以删除的临时工件。

例如,如果您使用python setup.py develop进行"可编辑的"安装(通过-egg.info之类的符号链接工作,这样您每次在本地编辑时都不必重新安装包),导入包时,运行时需要DistributionNotFound文件夹另一个来源。如果它不存在,您将收到DataAdapter错误。

答案 2 :(得分:9)

请注意,您可以完全从您的sdist消失PROJECT.egg-info个工件。

命令setup.py egg_info默认使用源根作为egg base,导致PROJECT.egg-info目录被打包到sdist中。

您可以通过传递选项--egg-base来配置蛋基。 这将在其他地方创建PROJECT.egg-info目录,完全将其从源代码分发中删除。您也可以使用setup.cfg来设置该属性。

以下命令创建没有PROJECT.egg-info的sdist对我有用:

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

setup.cfg

[egg_info]
egg_base = /tmp

答案 3 :(得分:1)

Python的打包和构建系统被打破了。因此,对于那些让人难以置信的事情,有很多破解和解决方法。

但是,我发现用于删除* .egg-info的“最干净的”黑客正在使用普通的clean --all开关和egg_info来将* .egg-info文件放置在子文件夹中将由clean命令清除。下面是一个示例:

在您的setup.cfg中使用以下命令:

[egg_info]
egg_base = ./build/lib

其中./build/libclean --all将删除的文件夹。然后,在使用setuptools构建项目时,请使用带有--all标志的clean命令,例如

python setup.py bdist_wheel clean --all

如果您还想构建源包,请确保在sdist之前构建bdist_wheel,以便存在build / lib文件夹,例如:

python setup.py bdist_wheel sdist clean --all