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