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

时间:2019-06-08 17:44:12

标签: python installation anaconda virtualenv

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

以下是我正在尝试的背景。我们正在开发一系列将要投入生产的聊天机器人。它们每个都将在Anaconda的环境中运行。但是,我们的设置使用tensorflow,后者使用gcc进行编译,并且合规性禁止编译器投入生产。此外,在生产环境中使用pip或conda安装程序也违反了合规性规则。

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

我的问题如下:

  1. 是否有什么好方法可以将anaconda从一个用户转移到另一个用户,而不必在这些路径上使用\home\<prod account>\anaconda?我已经读过Anaconda本身不支持此功能,但是我希望您的输入。
  2. 我是否可以在开发人员中安装anaconda,因此其中的脚本经过硬编码以在其路径中使用生产帐户名称,或使用sed -i
  3. 如果我必须继续使用~,我有什么需要注意的关键问题?例如,当我使用sed时,我会将一些文件列为grep <dev account> *。我需要做一些特别的事情来改变这些吗?

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

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

Edit2: 我已经确认我得到的错误与此无关。为了使bot能够与Anaconda的移植版本一起正常工作,我所要做的就是更改/ etc中的conda.sh和conda.csh文件,因此它们的python路径使用〜,对activate和停用/ bin中的文件,然后将/ bin中的conda文件中的shebang行更改为使用实际帐户名。这样,/ bin和lib中的所有其他文件仍会在其shebang行和使用该路径的其他变量中仍使用旧帐户名,但是bot仍可以正常工作。依我所有的权利,我认为这不起作用,但确实如此。

3 个答案:

答案 0 :(得分:1)

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

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

    • 根据需要安装编译器。
    • 构建自己的东西。
    • 卸载运行时不需要的编译器和其他内容。
    • 将图像压缩为单个图层。
      这样可以确保卸载的东西实际上不见了。
  2. 还将Anaconda安装到开发或构建系统的目录 \home\<prod account>\anaconda中。即使帐户不同,也应该有一种方法可以在同一位置创建用户可写目录。

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

    • 如有必要,请从质量检查的角度进行探讨:与所有其他环境相比,生产中的目录路径不同,存在只能在生产中检测和复制的错误的风险。质量检查或运营团队应该授权,所有应用程序都在各处使用固定路径,而不是为您的应用程序设置例外;-)
  4. 使用目录\home\<prod account>\anaconda在Docker容器中构建,然后导出存档并在没有Docker的生产系统上运行。

    • 在可重现的Docker环境中进行构建通常是一个好主意,即使您可以获得不带帐户名的固定路径。
  5. 将整个应用程序捆绑为预编译的Anaconda软件包,以便无需编译器即可安装。

    • 但这并不能真正解决您的问题,因为即使conda install在生产中也会皱眉。但这可以简化构建Docker映像而不会造成挤压。

我一直在Docker内部构建Anaconda环境,并在生产中的裸机上运行它们。但是,我们始终确保路径在环境之间相同。我发现整修路径太可怕了,甚至无法尝试。当我们到处切换到Docker映像时,生活变得更加简单。但是,如果您必须继续使用sed ...祝您好运:-)

答案 1 :(得分:0)

这可能是您需要的: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兼容的“简单”包索引:

$ 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

答案 2 :(得分:0)

<块引用>

但它们也可以插入到二进制文件中

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

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