当我跑步时
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}
答案 0 :(得分:52)
此目录是有意创建的,作为源代码分发的构建过程的一部分。 developer guide for setuptools的一个小勇士会给你一个暗示:
但是,请务必忽略其中的任何部分 distutils交易的文件 使用MANIFEST或它是如何生成的 来自MANIFEST.in; setuptools盾牌 你从这些问题,但不起作用 在任何情况下都是一样的。不像 distutils,setuptools重新生成 源分发清单文件 每次构建源代码 分发,并在内部构建它 项目的.egg-info目录,out 你的主要项目的方式 目录。因此你不需要 担心它是否是最新的 或不。
您可以在构建完成后安全地删除目录。
奖金编辑:
我在我的clean
中为我的许多Python项目自定义setup.py
命令,以删除*.egg-info
,dist
,build
和{{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/lib
是clean --all
将删除的文件夹。然后,在使用setuptools构建项目时,请使用带有--all标志的clean命令,例如
python setup.py bdist_wheel clean --all
如果您还想构建源包,请确保在sdist之前构建bdist_wheel,以便存在build / lib文件夹,例如:
python setup.py bdist_wheel sdist clean --all