将 Anaconda 安装从一个用户帐户移动到另一个用户帐户

Moving Anaconda installation from one user account to another

如果这不是正确的网站,我深表歉意。如果不是,请告诉我。

这是我正在尝试的一些背景知识。我们正在开发一系列即将投入生产的聊天机器人。他们每个人都会 运行 在 Anaconda 的环境中。但是,我们的设置使用 tensorflow,它使用 gcc 进行编译,合规性已禁止生产编译器。此外,合规性规则也不赞成我们在生产中使用 pip 或 conda install。

作为解决此问题的一种方法,我正在尝试 tar Anaconda 3 文件夹并将其移动到 prod 中,所有依赖项都已编译和安装。但是,环境之间的帐户有不同的名称,所以这需要我进入 bin 文件夹(至少;我确定我也需要在 lib 和 pckg 文件夹中更改它们)并使用 sed -i 将硬编码路径重命名为从 \home\<dev account>\anaconda 指向 \home\<prod account>\anaconda,虽然这似乎可行,但它也是破坏我的安装的好方法。

我的问题如下:

  1. 有什么好的方法可以将 anaconda 从一个用户转移到另一个用户,而不必在这些路径上使用 sed -i?我已经读到 Anaconda 本身不支持这一点,但我希望您能提供意见。
  2. 我有什么办法可以在 dev 中安装 anaconda,这样其中的脚本要么被硬编码为在其路径中使用生产帐户名称,要么使用 ~.
  3. 如果我必须继续使用 sed,有什么我应该注意的重要事项吗?例如,当我使用 grep <dev account> * 时,我会将某些文件列为 binary file matches。我需要做任何特别的事情来改变这些吗?

再一次,我很清楚我应该在生产机器上创建一个新的 Anaconda 安装,但这根本不是一个选项。

编辑: 到目前为止,我已经更改了 /etc 中的 conda.sh 和 conda.csh 文件,以及根目录中的 conda、activate 和 deactivate 文件。因此,我能够在新用户帐户上激活和停用我的环境。另外,我把bot环境下bin文件夹下的文件都改了。现在,我正在尝试训练机器人来测试它是否有效,但它一直失败并指出列表中不存在自定义操作。不过,我认为这与此无关。

编辑2: 我已经确认我遇到的错误与此无关。为了让 bot 与 Anaconda 的移植版本一起正常工作,我必须更改的是 /etc 中的 conda.sh 和 conda.csh 文件,因此它们到 python 的路径使用 ~ ,对 /bin 中的激活和停用文件执行相同操作,并将 /bin 中的 conda 文件中的 shebang 行更改为使用实际帐户名。这使得 /bin 和 lib 中的所有其他文件仍然在其 shebang 行中使用旧帐户名以及使用该路径的其他变量,但机器人仍按预期工作。无论如何,我认为这应该行不通,但确实如此。

这可能是您需要的:pip2pi

这仅适用于 pip 兼容包。

据我所知,您需要将之前编译为 .tar.gz 文件的整个设置移动,然后您可以尝试以下几项操作:

  1. 创建一个requirements.txt。这些软件包可以提供帮助:
    一种。 pipreqs

    $ pipreqs /home/project/location
    Successfully saved requirements file in /home/project/location/requirements.txt
    

    b。 snakefood.

  2. 然后,安装pip2pi

    $ pip install pip2pi

    $ pip2tgz packages/ foo==1.2
    ...
    $ ls packages/
    foo-1.2.tar.gz
    bar-0.8.tar.gz
    

pip2tgz 将包参数直接传递给 pip,因此可以以 pip 可识别的任何格式指定包:

$ cat requirements.txt
foo==1.2
http://example.com/baz-0.3.tar.gz
$ pip2tgz packages/ -r requirements.txt bam-2.3/
...
$ ls packages/
foo-1.2.tar.gz
bar-0.8.tar.gz
baz-0.3.tar.gz
bam-2.3.tar.gz

获取所有.tar.gz个文件后,.tar.gz个文件可以使用dir2pi命令变成PyPI-compatible"simple"包索引:

$ ls packages/
bar-0.8.tar.gz
baz-0.3.tar.gz
foo-1.2.tar.gz
$ dir2pi packages/
$ find packages/
packages/
packages/bar-0.8.tar.gz
packages/baz-0.3.tar.gz
packages/foo-1.2.tar.gz
packages/simple
packages/simple/bar
packages/simple/bar/bar-0.8.tar.gz
packages/simple/baz
packages/simple/baz/baz-0.3.tar.gz
packages/simple/foo
packages/simple/foo/foo-1.2.tar.gz

Anaconda 对路径名很敏感。它们显然被插入到脚本中,但它们也可能被插入到二进制文件中。我想到的一些方法是:

  1. 在生产中使用 Docker 个图像。构建图像时:

    • 根据需要安装编译器。
    • 建立你的东西。
    • 在 运行 时卸载编译器和其他不需要的东西。
    • 将图像压缩成一个图层。
      这可以确保卸载的东西确实消失了。
  2. 将 Anaconda 安装到开发或构建系统的 目录 \home\<prod account>\anaconda 中。尽管 accounts 不同,但应该有一种方法可以在同一位置创建 user-writeable 目录。

    • 更好:在所有环境中将 Anaconda 安装到目录 \opt\anaconda 中。或者其他一些不包含用户名的目录。
  3. 如果您无法获得用户主目录之外的目录,请在指向用户主目录的固定路径 \opt\anaconda 处协商符号链接或联结 (mklink.exe /d or /j) .

    • 如有必要,从 QA 的角度进行分析:与所有其他环境相比,生产环境中的不同目录路径会引入只能在生产环境中检测和重现的错误风险。 QA 或运营团队应该强制 所有应用程序在任何地方都使用固定路径,而不是为你的应用程序设置例外 ;-)
  4. 使用目录 \home\<prod account>\anaconda 在 Docker 容器内构建,然后在没有 Docker 的生产系统上导出存档和 运行。

    • 在可重现的 Docker 环境中构建通常是个好主意,即使您可以获得其中没有帐户名的固定路径。
  5. 将您的整个应用程序捆绑为一个 pre-compiled Anaconda 包,这样它就可以在没有编译器的情况下安装。

    • 虽然这并不能真正解决您的问题,因为甚至 conda install 在生产中也不受欢迎。但它可以简化构建 Docker 图像而无需压缩。

我一直在 Docker 中构建 Anaconda 环境,并且 运行 也在生产中将它们安装在裸机上。但我们始终确保路径在不同环境中是相同的。我发现破坏路径太可怕了,甚至无法尝试。当我们随处切换到 Docker 图片时,生活变得简单多了。但是如果你必须继续使用 sed...祝你好运:-)

but they may be inserted into binaries as well

我可以确认一些包已经将绝对路径(包括用户名)硬编码到编译的二进制文件中。但是,如果您限制用户名具有相同的长度,则可以在二进制文件和文本文件上应用 sed 以使几乎所有内容都能完美运行。

另一方面,如果您复制整个文件夹并使用 sed 仅替换文本文件上的用户名,则您可以 运行 大多数已安装的软件包。但是,涉及运行次编译的操作可能会失败,一个例子是安装一个需要在安装过程中编译的新包。