我想分发一个完整的virtualenv,或者一堆具有运行时依赖性的精确版本的Python轮,例如:
- pycurl
- pycurl.so
- libcurl.so
- libz.so
- libssl.so
- libcrypto.so
- libgssapi_krb5.so
我想我可以依赖系统安装libssl.so,但肯定不是libcurl.so的正确版本,可能不是Kerberos。
在具有所有运行时依赖性的轮中打包一个库的最简单方法是什么?
或者这是一个傻瓜的差事,我应该打包整个virtualenv?
如何可靠地做到这一点?
附:动态编译不是一种选择,一些模块是修补的。
AFAIK,没有很好的标准方法可以在您的软件包中可移植地安装依赖项。 Continuum有 为这个目的做了conda。 numpy家伙在他们的包中编写了自己的distutils子模块来安装一些复杂的依赖项,现在 至少其中一些人主张将康达作为解决方案。不幸的是,您可能必须自己为其中一些依赖项制作conda包。
如果你没有可移植性就好了,那么定位目标机器的包管理器显然会有效。否则,对于便携式包管理器,conda是我所知道的唯一选择。
另外,从您的帖子(“动态编译不是一个选项”)听起来像可移植性可能不是一个问题,在这种情况下,您也可以将所有要求安装到前缀目录(我遇到的大多数安装程序)支持 configure --prefix=/some/dir/
选项)。如果您有一个有保证的单一体系结构,您可以将所有依赖项前缀 - 安装到单个目录中,并像文件一样传递它。 conda方法可能会更干净,但我已经使用了相当多的前缀安装,它们往往是最容易实现的解决方案之一。
编辑:
至于conda,它同时是一个包管理器和类似“virtualenv”的环境/ python安装。虽然virtualenv是在现有的python安装之上添加的,但conda接管整个安装,因此您可以更加确定所有依赖项都被考虑在内。与pip相比,它被设计用于添加通用的非Python依赖项,而不仅仅是编译C / Cpp exentions。有关详细信息,我会看到:
至于如何使用康达为您的目的, 文档 解释如何创建配方:
Conda构建框架
构建包需要配方。食谱是平面目录
包含以下文件:
meta.yaml
(元数据文件)
build.sh
(使用bash执行的Unix构建脚本)
bld.bat
(使用cmd执行的Windows构建脚本)
run_test.py
(可选的Python测试文件)
- 补丁到源(可选,见下文)
- 其他资源,不包含在源中,也不能包含在内
由构建脚本生成。
应该使用相同的配方在所有平台上构建包。
构建包时,将调用以下步骤:
- 阅读元数据
- 下载源(进入缓存)
- 提取源中的 源目录
- 应用补丁
- 创建一个 建立环境 (这里安装了构建依赖项)
- 运行实际的构建脚本。当前工作目录是源
设置了环境变量的目录。构建脚本安装到
构建环境
- 做一些必要的后处理步骤:shebang,rpath等。
- 将conda元数据添加到构建环境中
- 将构建环境中的新文件打包到conda包中
- 测试新的conda包:
- 创建一个 测试环境 包(及其依赖项)
- 运行测试脚本
有很多conda包的示例配方 conda-recipes
<https://github.com/continuumio/conda-recipes>
_ repo。
裁判:conda skeleton <skeleton_ref>
命令可以帮助制作常见的骨架食谱
存储库,例如 PyPI <https://pypi.python.org/pypi>
_。
然后,作为客户端,您将安装该程序包 类似于你从pip安装的方式
最后, 搬运工人 你也可能感兴趣,虽然我还没有看到它用于Python。
您可能想要了解PEX: https://pex.readthedocs.io/en/stable/whatispex.html
'扩展名为.pex的文件 - “PEX文件”或“.pex文件” - 是自包含的可执行Python虚拟环境。 PEX文件可以轻松部署Python应用程序:部署过程变得简单scp。