“为什么?”;python setup.py sdist“;“创建不需要的”;鸡蛋计划信息“;在项目根目录中?

“为什么?”;python setup.py sdist“;“创建不需要的”;鸡蛋计划信息“;在项目根目录中?,python,setuptools,distutils,distribute,setup.py,Python,Setuptools,Distutils,Distribute,Setup.py,当我跑的时候 python setup.py sdist 它在my./dist目录中创建一个sdist。这包括一个“projectegg.info”文件,在我的“dist”文件夹中的zip中,我不使用它,但它不会伤害我,所以我忽略它 我的问题是,为什么它还要在我的项目根目录中创建一个“projectegg.info”文件夹?我能让它停止制造这个吗?如果没有,我可以在创建sdist后立即删除它吗 我正在使用从setuptools导入的“设置”功能。 WindowsXP、Python2.7、S

当我跑的时候

  python setup.py sdist
它在my./dist目录中创建一个sdist。这包括一个“projectegg.info”文件,在我的“dist”文件夹中的zip中,我不使用它,但它不会伤害我,所以我忽略它

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

我正在使用从setuptools导入的“设置”功能。 WindowsXP、Python2.7、Setuptools 0.6c11、Distribution 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}

此目录是作为源发行版的构建过程的一部分特意创建的。稍微看一眼,你就会明白为什么:

但是,一定要忽略问题的任何部分 distutils文档,用于处理 或者它是如何生成的 从清单1.in;设置工具屏蔽 你可以从这些问题中解脱出来,但不起作用 无论如何都是这样。不像 distutils、setuptools将重新生成 源分发清单文件 每次构建源代码时 分发,并在内部构建它 项目的.egg信息目录,out 你的主要项目是什么 目录因此,你不需要这样做 担心它是否是最新的 或者不是

构建完成后,您可以安全地删除该目录

奖金编辑:

我在我的许多Python项目中自定义了
setup.py
中的
clean
命令,以删除
*.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,
    }
)
举例来说,在一个名为“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'

塔达

注意,您可以让
项目.egg info
工件从您的sdist中完全消失

默认情况下,命令
setup.py egg_info
将使用源根作为egg基,从而将
PROJECT.egg info
目录打包到sdist中

您可以通过传递选项
--egg base
来配置egg base。 这将在其他地方创建
PROJECT.egg info
目录,将其完全排除在源代码发行版之外。您还可以使用
setup.cfg
来设置该属性

以下用于创建不带
项目的sdist的命令。egg info
适用于我:

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
的符号链接工作,因此您不必每次在本地编辑包时都重新安装包),则在运行时将包导入其他源时需要
-egg.info
文件夹。如果它不存在,您将得到一个
DistributionNotFound
错误。

Pythons打包和构建系统在imho中损坏。因此,有许多黑客和变通方法,人们相信这些方法是开箱即用的

然而,我发现的删除*.egg信息的“最干净”的方法是使用正常的
clean--all
开关以及
egg_info
将*.egg信息文件放在一个子文件夹中,该子文件夹将由clean命令清理。这里有一个例子:

在您的
setup.cfg
中,使用如下内容:

[egg_info]
egg_base = ./build/lib
其中
/build/lib
是一个
clean-all
将删除的文件夹。然后,在使用setuptools构建项目时,使用带有--all标志的clean命令,例如

python setup.py bdist\u wheel clean--all

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


python setup.py bdist\u wheel sdist clean--all

非常感谢您的见解。我永远不知道我是否应该在文档中搜索distutils、setuptools或distribute。在选择您的答案之前,我将等待一段时间,以防我还没有发现类似kwarg的东西,并告诉setuptools不要这样做。因此,我在我的Makefile中添加了行,以删除“make clean”上的*.egg信息,或者在执行“make sdist”之后。谢谢你让我放心,这不一定会破坏一切。不客气。这正是我在
setup.py中所做的。我很高兴能帮上忙!:)@jathanism您是如何将这个额外的行为添加到
setup.py
中的,例如,
python setup.py clean
删除
.egg INFO
目录的?请看一下这个,看看我是如何做到的。这很简单。FTR:相关问题(但不重复:这一个是关于sdist期间创建的鸡蛋信息文件,另一个是关于安装期间创建的鸡蛋信息):遗憾的是,
setuptools
在某些时候故意破坏了对绝对
egg_base
路径名的支持。现在发出以下致命错误:
setup()参数必须*始终*是相对于setup.py目录的/-separated路径,*从不*绝对路径。
sign。