【问题标题】:simply use python anaconda without internet connection只需在没有互联网连接的情况下使用 python anaconda
【发布时间】:2016-05-23 13:05:28
【问题描述】:

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

【问题讨论】:

  • Anaconda 发行版完全是一个包括电池,并提供了一个非常好的环境设置。设置它的任何工作量都是值得的!你试过this吗?
  • 您下载安装程序了吗?第一次安装时,我通过 GUI 或安装 wizard 完成所有操作。直到我需要升级软件包或以其他方式管理我需要通过命令行直接运行 conda 的软件包。
  • 您好,谢谢。我试过这个:
  • 您好,谢谢!好的,我试过这个: conda create --offline --dry-run --channel /opt/software/anaconda3/pkgs --name etl_appi numpy 还有这个: conda create --离线 --dry-run --channel /opt/software/anaconda3/ --name etl_appi numpy 。但它显示了同样的信息。注意:我使用了安装程序,但我使用的是 linux 系统。但是,anaconda 包似乎是 bz2 档案。 pkgs 目录中的东西看起来像是已经安装的模块。不是回购...

标签: python anaconda


【解决方案1】:

好吧,在阅读了 Fabio Nelli 的书“Python 数据分析”的同时玩弄了 Pandas 之后,我意识到 Pandas 是一个多么棒的库。 所以,我一直在与 Anaconda 合作,让它在我的环境中工作。

1- 下载 Anaconda 安装程序并安装(我猜 miniconda 就足够了)

2- 通过镜像(部分)anaconda 存储库来创建本地频道

不要尝试在您的工作站上下载单个软件包以将它们推送到您的离线服务器。事实上,依赖关系不会得到满足。 包需要包含在频道中并在元数据文件(repodata.json 和 repodata.json.bz2)中建立索引才能正确“粘合”在一起。

我使用 wget 镜像 anaconda 存储库的一部分:https://repo.continuum.io/pkgs/ 我用这样的东西来过滤掉包,以免下载整个仓库:

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 中的元数据。他们选择只编辑 repo 元数据来解决问题,而不是每个包元数据。 所以,如果你从包中重建频道元数据,你就会错过。

==> 所以:不要重建频道元数据,只保留存储库元数据(repodata.json 和 repodata.json.bz2 包含在官方 anaconda 存储库中)。 即使整个 repo 不在您的新频道中,它也会起作用(至少,如果您在镜像时没有过滤太多 ;-))

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 文件来强制使用这个本地通道。

希望对你有帮助。

纪尧姆

【讨论】:

  • 似乎拒绝所有 pyXX 文件。知道问题出在哪里吗?
【解决方案2】:

另一种选择是使用conda-pack
来自documentation

在源机器上

  • 将环境 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

在目标机器上

  • 将环境解压到目录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

【讨论】:

  • 首先安装conda pack:“conda install -c conda-forge conda-pack”
  • 如果源机器是 Windows 10,但目标机器是 Windows 7,这会起作用吗?
【解决方案3】:

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

情况/假设:

  1. 生产服务器和我的机器都使用Linux,anaconda3,并且它们是相同的架构(在我的例子中:x86_64)。

  2. 生产服务器没有网络

  3. 用于部署的机器有互联网,并且通过 SSH 连接到生产环境(隧道、VPN 等)

适用于我的 conda 4.3 的诀窍是使用 sshfs 将目标环境安装为您自己的环境之一:

# prepare and enter the env 'remotely'
me@development:~/$ mkdir anaconda3/envs/production
me@development:~/$ sshfs prod_user@production.example.com: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 目录,需要特殊处理(例如,环境仅对bin/ 子目录中的condaactivatedeactivate 可执行文件进行符号链接)。然后你可以“全部”并挂载整个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 prod_user@production.example.com: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

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

【讨论】:

  • 优点:您不必离线下载整个频道,依赖项工作,最后(我不确定) - 对于非 root 环境 也许 使用本地缓存,因此可以为地球节省一些 Internet 流量。但是 OP 会建议本地包缓存并不总是像我们想要的那样工作。
猜你喜欢
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
相关资源
最近更新 更多