分发自定义python环境的推荐方法是什么? 问题

分发自定义python环境的推荐方法是什么? 问题,python,pythonpath,python-venv,Python,Pythonpath,Python Venv,我想向计算节点分发一些自定义python包。安装路径与生成路径不同,因此不能硬编码路径。安装过程不应比source/path/to/MyOrgCode/setup.sh复杂,理想情况下不应要求下载或重新安装所有内容。我看到了几种可能的方法来实现这一点,所有这些方法似乎都有很大的缺点 请提供一些背景资料,以给出一个具体的例子 高能物理社区使用一个名为的工具将编译后的可执行文件、库和数据文件分发到计算集群上的节点。通常,您在与节点具有相同体系结构的机器上编译代码,然后发布到中央存储库。因此,我可能会

我想向计算节点分发一些自定义python包。安装路径与生成路径不同,因此不能硬编码路径。安装过程不应比
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是可能的,尽管它的重量比我希望的要重