只需使用没有互联网连接的python anaconda

问题描述 投票:9回答:3

我想在无法访问互联网的生产服务器上部署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

python anaconda
3个回答
8
投票

好吧,在阅读了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文件来强制使用此本地频道。

希望能帮助到你。

威廉


0
投票

我有类似的情况,并想出了一个不同的解决方案 - 可能更少'Pythonic'('Condaic?'),但非常方便。它有一些假设,但它可能是一种常见的情况,即使在你的情况下也可能有用;)

情况/假设:

  1. 生产服务器和我的机器都使用Linux,anaconda3,它们是相同的架构(在我的例子中:x86_64)。
  2. 生产服务器没有Internet
  3. 用于部署的机器具有Internet和SSH到生产(隧道,VPN,等等)

这个技巧 - 与我的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子目录中的activatedeactivatebin/可执行文件)。然后你可以“全进去”并安装整个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

这对我有用,但我建议您在进行这样的实验之前备份您的生产环境。


0
投票

另一种选择是使用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
© www.soinside.com 2019 - 2024. All rights reserved.