我想在无法访问互联网的生产服务器上部署python环境。
我发现了Python Anaconda发行版并安装它以试一试。安装目录是1.6GB,我可以在pkgs
目录中看到很多库都在那里。
但是,当我尝试安装环境时,conda
不会在本地目录中查找...
conda create --offline --use-local --dry-run --name pandas_etl python
Using Anaconda Cloud api site https://api.anaconda.org
Fetching package metadata:
Solving package specifications:
Error: Package missing in current linux-64 channels:
- python
那么,如果conda
需要在在线存储库中获取它们,那么捆绑所有这些库的重点是什么?也许我错过了什么?
我正在寻找一种“包含python的大量电池”,以方便部署。
注意:我使用Linux系统并安装了常规的anaconda,而不是miniconda
好吧,在阅读了Fabio Nelli的书“Python Data Analytic”之后玩弄熊猫之后,我意识到Pandas是多么令人敬畏的库。所以,我一直在与Anaconda合作,使其在我的环境中工作。
1-下载Anaconda安装程序并安装它(我想miniconda就足够了)
2-通过镜像anaconda存储库的(部分)来创建本地通道
请勿尝试下载工作站上的各个软件包以将其推送到脱机服务器。实际上,依赖性将不会得到满足。包需要包含在一个通道中,并在元数据文件(repodata.json和repodata.json.bz2)中编入索引,以便正确地“粘合”在一起。
我使用wget来镜像anaconda存储库的一部分:https://repo.continuum.io/pkgs/我使用这样的东西过滤掉包以便不下载整个repo:
wget -r --no-parent -R --regex-type pcre --reject-regex '(.*py2[67].*)|(.*py[34].*)' https://repo.continuum.io/pkgs/free/linux-64/
当心,不要使用像“只有py35”包这样的东西。实际上,repo中的许多包都没有名字中的版本字符串;你会想念他们作为依赖。
好吧,我想你可以更准确地过滤。我拿了大约6GB的包裹!
!!!!不要从刚刚下载的存储库部分构建自定义通道! (anaconda自定义通道)我首先尝试了这个,我遇到了这个异常:“RecursionError:调用Python对象时超出了最大递归深度”。这是一个已知的pb:https://github.com/conda/conda/issues/2371 ==>维护者讨论这个:在repodata.json和repodata.json.bz2中维护的元数据不反映个体pkg中的metadatas。他们选择仅编辑repo元数据来修复问题而不是每个包metadatas。因此,如果您从包中重建通道元数据,那么您将错过。
==>所以:不要重建频道元数据,只需保留存储库元数据(官方anaconda存储库中包含的repodata.json和repodata.json.bz2)。即使整个回购不在您的新渠道中,它也会起作用(至少,如果您在镜像时没有过滤太多;-))
3-测试并使用您的新频道
conda search -c file://Path_to_your_channel/repo.continuum.io/pkgs/free/ --override-channels
注意:请勿在路径中包含平台体系结构。例子:您的频道树可能是:/Path_to_your_channel/repo.continuum.io/pkgs/free/linux-64只需省略你的拱门(在我的情况下是linux-64)。康达会发现。
更新:
conda update -c file://resto/anaconda_repo/repo.continuum.io/pkgs/free/ --override-channels --all
等等...我想,您可以使用系统用户的conda conf文件来强制使用此本地频道。
希望能帮助到你。
威廉
我有类似的情况,并想出了一个不同的解决方案 - 可能更少'Pythonic'('Condaic?'),但非常方便。它有一些假设,但它可能是一种常见的情况,即使在你的情况下也可能有用;)
情况/假设:
这个技巧 - 与我的conda 4.3一起使用 - 是使用sshfs
将目标环境安装为您自己的一个:
# prepare and enter the env 'remotely'
me@development:~/$ mkdir anaconda3/envs/production
me@development:~/$ sshfs [email protected]:anaconda3/envs/production anaconda3/envs/production
me@development:~/$ source ~/anaconda3/bin/activate production
# do the work
(production) me@development:~/$ conda install pandas
# do the cleanup
(production) me@development:~/$ source deactivate
me@development:~/$ fusermount -u anaconda3/envs/production
当您想要使用根环境时,问题就出现了。这是在所有anaconda3
目录之后,它需要特别处理(例如envs只有符号链接conda
子目录中的activate
,deactivate
和bin/
可执行文件)。然后你可以“全进去”并安装整个anaconda3
目录,但有一个警告 - 你的机器上的路径必须匹配生产!
# prepare and enter anaconda root 'remotely'
me@development:~/$ sudo ln -s /home/me /home/prod_user
me@development:~/$ mv anaconda3 my_anaconda
me@development:~/$ mkdir anaconda3
me@development:~/$ sshfs [email protected]:anaconda3 anaconda3
# activate the root
me@development:~/$ source ~/anaconda3/bin/activate
# do the work
(root) me@development:~/$ conda install pandas
# do the cleanup
(root) me@development:~/$ source deactivate
me@development:~/$ fusermount -u anaconda3
me@development:~/$ rmdir anaconda3
me@development:~/$ mv my_anaconda anaconda3
这对我有用,但我建议您在进行这样的实验之前备份您的生产环境。
另一种选择是使用conda-pack。 来自documentation:
On the source machine
- 将环境my_env打包到my_env.tar.gz中 $ conda pack -n my_env
- 将环境my_env打包到out_name.tar.gz中 $ conda pack -n my_env -o out_name.tar.gz
- 包装环境位于my_env.tar.gz的显式路径中 $ conda pack -p / explicit / path / to / my_env
On the target machine
- 将环境解压缩到目录
my_env
$ mkdir -p my_env $ tar -xzf my_env.tar.gz -C my_env- 使用python而不激活或修复前缀。 大多数python库都可以正常工作,但需要前缀清理的东西将会失败。 $ ./my_env/bin/python
- 激活环境。这会将
my_env/bin
添加到您的路径中 $ source my_env / bin / activate- 从环境中运行python (my_env)$ python
- 从活动环境中清除前缀。
- 请注意,也可以在不激活环境的情况下运行此命令
- 只要某些版本的python已经安装在机器上。 (my_env)$ conda-unpack
- 此时,环境就像您在此处安装一样
- 直接使用conda。所有脚本都应该正常工作。 (my_env)$ ipython --version
- 停用环境以将其从路径中删除 (my_env)$ source my_env / bin / deactivate