我想发布一个完整的virtualenv,或者一堆具有运行时依赖性的精确版本的Python轮,例如:
我想我可以依赖系统安装libssl.so,但肯定不是正确版本的libcurl.so而且可能不是Kerberos。
在具有所有运行时依赖性的轮中打包一个库的最简单方法是什么?
或者这是一个傻瓜的差事,我应该打包整个virtualenv? 如何可靠地做到这一点?
P.S。动态编译不是一种选择,有些模块是修补的。
答案 0 :(得分:10)
AFAIK,没有很好的标准方法可以在您的软件包中可移植地安装依赖项。 Continuum有made conda for precisely this purpose。 numpy人在他们的包中编写了自己的distutils子模块来安装一些复杂的依赖项,现在at least some of them advocate conda as a solution。不幸的是,您可能必须自己为其中一些依赖项制作conda包。
如果您没有可移植性,那么定位目标计算机的软件包管理器显然会有效。否则,对于便携式包管理器,conda是我所知道的唯一选择。
或者,来自您的帖子("动态编译不是一个选项")听起来便携性对您来说可能不是问题,在这种情况下您也可以将所有要求安装到前缀目录(我遇到的大多数安装程序都支持configure --prefix=/some/dir/
选项)。如果您有一个有保证的单一体系结构,您可以将所有依赖项前缀 - 安装到单个目录中,并像文件一样传递它。 conda方法可能更干净,但我已经使用了相当多的前缀安装,它们往往是最容易实现的解决方案之一。
编辑: 至于conda,它同时是一个包管理器和一个类似环境/ python安装的类似环境/ python安装。虽然virtualenv是在现有python安装的基础上添加的,但conda会接管整个安装,因此您可以更加确定所有依赖项都会被考虑在内。与pip相比,它被设计用于添加通用的非Python依赖项,而不仅仅是编译C / Cpp exentions。有关详细信息,我会看到:
至于如何将conda用于您的目的,the docs解释了如何创建食谱:
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。:ref:
conda skeleton <skeleton_ref>
命令可以帮助制作常见的骨架配方 存储库,例如PyPI <https://pypi.python.org/pypi>
_。
然后,作为客户端,您将安装包similar to how you would install from pip
最后,docker也可能对您感兴趣,但我还没有看到它用于Python。
答案 1 :(得分:2)
您可能需要查看PEX:https://pex.readthedocs.io/en/stable/whatispex.html
&#39;扩展名为.pex的文件 - “PEX文件”或“.pex文件” - 是自包含的可执行Python虚拟环境。 PEX文件可以轻松部署Python应用程序:部署过程变得简单scp。&#39;