我可以把一个虚拟的东西变成一个鸡蛋

时间:2016-10-20 23:00:14

标签: python virtualenv egg

我可以使用setuptools创建一个python egg:python setup.py bdist_egg。从理论上讲,我应该能够为每个安装了setup.py文件的软件包执行此操作。是否可以将整个virtualenv虚拟python环境封装到python egg?

2 个答案:

答案 0 :(得分:1)

我特别需要将任意数量的Python软件包打包到一个$? 中,因为我使用的系统仅接受 鸡蛋,并且每个鸡蛋都需要单独列出,当所需包装数量发生变化时,这些鸡蛋就变得毫无用处了。

.egg 文件只是一个 .zip ,其中包含名为.egg 的元数据文件夹,并且名称中包含版本号。 。您基本上可以先EGG-INFO,然后再cd lib/python-x.y/site-packages将内容压缩到 zip -r spaghetti-0.0.1.egg 文件中,但是您确实需要元数据

如果幸运的话,并且您没有使用入口点或其他高级功能的软件包,则可以在spaghetti-0.0.1.egg中创建一个名为EGG-INFO的目录,其中包含以下文件:< / p>

site-packages
除了dependency_links.txt entry_points.txt not-zip-safe PKG-INFO requires.txt top_level.txt 以外,它们

全部

PKG-INFO

Metadata-Version: 1.1 Name: spaghetti Version: 0.0.1 包含来自virtualenv的 all 个顶级软件包名称,每行一个,即,如果您已经安装了名称空间软件包{{ 3}}和top_level.txt,您的sqlalchemy应该有

top_level.txt

当然,事情并不总是那么简单。对于Python 2.7上的命名空间包(zope sqlalchemy 就是这种情况),有一些神奇的zope.component条目。对于这些,您需要在包中创建空的.pth,或者在__init__.py中列出它们;对于EGG-INFO/namespace_packages.txtzope.component是一个没有zope的命名空间包,因此__init__.py应该有EGG-INFO一行,namespace_packages.txt 。但是,无需此中间步骤,Python 3中的名称空间打包应可以按原样工作。

同样,如果您需要使用入口点,则需要将所有包的鸡蛋信息中的entrypoints.txt连接到鸡蛋的zope中。

更正:您不能以这种方式进行切入点,反正也不会遭到任何严重的黑客攻击。分发名称(在这种情况下为entrypoints.txt)将用于所有入口点,而不是包名称。没有直接的方法可以解决这个问题。


最后,spaghetti确实可以被认为是优于wheel的格式,但是它们不兼容,如果您可以则应该使用egg用于打包虚拟环境。但是,如果系统特别希望使用旧的wheel文件格式的文件,则它将无法使用wheel。此外,.egg有时无需安装,可以直接从.egg使用...

答案 1 :(得分:0)

由于多种原因,你不应该这样做

即使你可以设法做到这一点,它也不会像你期望的那样工作。如果用户已经安装了鸡蛋中的一个包,它们会发生冲突,因为python egg不会添加额外的命名空间。

此外,蟒蛇蛋正在逐渐消失。如果要创建二进制分发,则应使用较新的python wheels

如果你有一个带有依赖项的项目,只需在setup.py中声明这些依赖项,pip就会处理它们的安装。如果您有一些PyPi上不存在的依赖项,或者您需要一个非常具体的旧版本的软件包,那么只需将这些软件包作为子软件包包含在软件包中。

/my_package
    __init__.py
    /libs
        __init__.py
        /non_pypi_package
        /legacy_package 

然后在您的代码中,而不是将它们导入为

import non_pypy_package

你会用

from my_package.libs import non_pypi_package