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

当我跑步

python setup.py sdist 

它在我的./dist目录下创build一个sdist。 这包括我的“dist”文件夹中的“PROJECT-egg.info”文件,我不使用它,但它不会伤害到我,所以我忽略它。

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

我正在使用从setuptools导入的“设置”function。 WindowsXP,Python2.7,Setuptools 0.6c11,分发0.6.14。

我的设置configuration如下所示:

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

该目录是作为源代码发布的构build过程的一部分而有意创build的。 在setuptools的开发人员指南中的一个小矮人给了你一个暗示:

但是,一定要忽略涉及MANIFEST或者MANIFEST.in生成的distutils文档的任何部分; setuptools保护你免受这些问题,并在任何情况下不以相同的方式工作。 与distutils不同的是,setuptools在每次构build源代码发布时重新生成源代码发布清单文件,并将其构build到项目的.egg-info目录中,而不是在主项目目录中。 因此,您不必担心它是否是最新的。

构build完成后,您可以安全地删除目录。

奖金编辑:

我在我的许多Python项目的setup.py定制了clean命令来删除*.egg-infodistbuild*.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, } ) 

为了说明,在一个名为“poop”的虚拟项目(是的,我非常成熟)上运行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

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

田田!

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

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

您可以通过传递选项--egg-base蛋基来configuration蛋--egg-base 。 这将在其他地方创buildPROJECT.egg-info目录,完全离开源代码发布。 您也可以使用setup.cfg来设置该属性。

下面的命令创build一个没有PROJECT.egg-info的sdist适用于我:

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

或者在setup.cfg

 [egg_info] egg_base = /tmp 

-egg.info文件夹并不总是您可以删除的临时工件。

例如,如果使用pip install -e YOURPACKAGE进行“可编辑”安装(通过象python setup.py develop symlink工作,所以每次在本地编辑时都不必重新安装一个软件包),- -egg.info文件夹在运行时需要在另一个源中导入包。 如果它不存在,您将得到DistributionNotFound错误。