分发自定义python环境的推荐方法是什么? 问题
我想向计算节点分发一些自定义python包。安装路径与生成路径不同,因此不能硬编码路径。安装过程不应比分发自定义python环境的推荐方法是什么? 问题,python,pythonpath,python-venv,Python,Pythonpath,Python Venv,我想向计算节点分发一些自定义python包。安装路径与生成路径不同,因此不能硬编码路径。安装过程不应比source/path/to/MyOrgCode/setup.sh复杂,理想情况下不应要求下载或重新安装所有内容。我看到了几种可能的方法来实现这一点,所有这些方法似乎都有很大的缺点 请提供一些背景资料,以给出一个具体的例子 高能物理社区使用一个名为的工具将编译后的可执行文件、库和数据文件分发到计算集群上的节点。通常,您在与节点具有相同体系结构的机器上编译代码,然后发布到中央存储库。因此,我可能会
source/path/to/MyOrgCode/setup.sh复杂,理想情况下不应要求下载或重新安装所有内容。我看到了几种可能的方法来实现这一点,所有这些方法似乎都有很大的缺点
请提供一些背景资料,以给出一个具体的例子
高能物理社区使用一个名为的工具将编译后的可执行文件、库和数据文件分发到计算集群上的节点。通常,您在与节点具有相同体系结构的机器上编译代码,然后发布到中央存储库。因此,我可能会在/home/user/MyOrg
中构建我的代码,该代码发布后会出现在/cvmfs/MyOrg.opensciencegrid.org
的计算节点上。为了使其可移植,您提供了一个安装脚本,该脚本可能类似于
#MyOrg setup.sh脚本
export PATH=“`dirname$0`/bin:$PATH”
export LD\u LIBRARY\u PATH=“`dirname$0`/lib:$LD\u LIBRARY\u PATH”
这样,所有内容都是相对于安装脚本的位置进行设置的,因此整个目录树可以轻松地移动和重命名。不知何故,我看不到一种简单的方法来处理python包
分发python包的选项
1) 使用虚拟环境
我可以在“bin”和“lib”目录旁创建一个虚拟环境,复制整个内容,然后在安装脚本中调用source/path/to/MyOrgCode/venv/bin/setup.sh
。但是:
- 虚拟环境使用硬编码路径,因此默认情况下无法移动它们
virtualenv
有--relocatable
选项,但是有很多关于它如何会把事情搞砸的警告。另外,据我所知,virtualenv
被认为是不推荐使用的,而支持python-mvenv
- 由于venv通常安装在没有写权限的地方,用户将无法安装更多的自定义开发包,因为
pip install--user
在venv中不起作用李>
2) 按需安装
在我的安装脚本中有一行pip安装-r requirements.txt
。这有许多潜在问题:
- 在哪里安装?
--user
安装将污染用户的默认python设置,并可能产生意外后果。可以用一个venv,但我们把它放在哪里李>
- 如果包中有大量代码要编译,或者包含大量数据集,那么这将非常低效
- 如果我的python包位于私有VCS上,我需要使用安装脚本分发访问凭据,一般来说,任何知道URL的人都可以读取该脚本李>
3) 使用蟒蛇
不管我有多少python软件包,都将它们放在我的存储库中,然后在我的安装脚本中为每个python软件包添加一个条目。潜在问题:
- 我似乎记得有人告诉我,修改PYTHONPATH是最后的手段,尽管现在我找不到任何证据支持这一点李>
- 如果软件包位于可编译的服务器上(即生成.pyc文件?),是否可以运行命令在分发之前强制编译
结论
有没有推荐的方法来做这类事情?有没有一种与我所想到的不同的方法,或者一种绕过陷阱的方法 您可以使用conda:或者也可以使用docker制作包含所需包的容器:@MasonCaiby docker是不可能的,因为它在计算节点上的支持不够广泛(您通常需要采取额外的步骤来确保获得与c++11兼容的编译器!)conda是可能的,尽管它的重量比我希望的要重