如果这不是正确的网站,我深表歉意。如果不是,请告诉我。
以下是我正在尝试的背景。我们正在开发一系列将要投入生产的聊天机器人。它们每个都将在Anaconda的环境中运行。但是,我们的设置使用tensorflow,后者使用gcc进行编译,并且合规性禁止编译器投入生产。此外,在生产环境中使用pip或conda安装程序也违反了合规性规则。
作为解决此问题的一种方法,我正在尝试将Anaconda 3文件夹压缩为tar,然后将其移动到prod中,并已编译并安装了所有依赖项。但是,环境之间的帐户具有不同的名称,因此这需要我进入bin文件夹(至少;我确定也需要在lib和pckg文件夹中更改它们)并使用{{1 }}重命名从sed -i
到\home\<dev account>\anaconda
的硬编码路径,虽然这似乎可行,但这也是处理安装的好方法。
我的问题如下:
\home\<prod account>\anaconda
?我已经读过Anaconda本身不支持此功能,但是我希望您的输入。sed -i
。~
,我有什么需要注意的关键问题?例如,当我使用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仍可以正常工作。依我所有的权利,我认为这不起作用,但确实如此。
答案 0 :(得分:1)
Anaconda对路径名敏感。它们显然已插入脚本中,但也可能会插入二进制文件中。我想到的一些方法是:
在生产中使用Docker映像。构建图像时:
还将Anaconda安装到开发或构建系统的目录 \home\<prod account>\anaconda
中。即使帐户不同,也应该有一种方法可以在同一位置创建用户可写目录。
\opt\anaconda
中。或其他不包含用户名的目录。如果无法在用户主目录之外获取目录,请在指向用户主目录的固定路径\opt\anaconda
上协商符号链接或联结(mklink.exe /d or /j)。
使用目录\home\<prod account>\anaconda
在Docker容器中构建,然后导出存档并在没有Docker的生产系统上运行。
将整个应用程序捆绑为预编译的Anaconda软件包,以便无需编译器即可安装。
conda install
在生产中也会皱眉。但这可以简化构建Docker映像而不会造成挤压。 我一直在Docker内部构建Anaconda环境,并在生产中的裸机上运行它们。但是,我们始终确保路径在环境之间相同。我发现整修路径太可怕了,甚至无法尝试。当我们到处切换到Docker映像时,生活变得更加简单。但是,如果您必须继续使用sed
...祝您好运:-)
答案 1 :(得分:0)
这可能是您需要的:pip2pi。
这仅适用于与pip兼容的软件包。
据我了解,您需要将整个设置移至先前编译为.tar.gz
文件的位置,然后可以尝试以下操作:
创建一个requirements.txt
。这些软件包可以帮助您:
一种。 pipreqs
$ pipreqs /home/project/location
Successfully saved requirements file in /home/project/location/requirements.txt
b。 snakefood。
然后安装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
替换文本文件上的用户名,则可以运行大多数已安装的软件包。但是,涉及运行时编译的操作可能会失败,例如安装一个需要在安装过程中编译的新包。