不需要网络连接,简单使用Python Anaconda

15
我希望在没有网络访问权限的生产服务器上部署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发行版完全是一个“电池包含”的,提供了非常好的环境设置。任何设置所需的工作量都是值得的!你试过这个吗?(https://dev59.com/plwZ5IYBdhLWcg3wM97Z#31776556) - tmthydvnprt
你下载了安装程序吗?第一次安装时,我通过GUI或安装向导完成了所有操作。直到我需要升级软件包或以其他方式管理软件包时,我才需要通过命令行直接运行conda - tmthydvnprt
你好,谢谢。我尝试了这个: - stockersky
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - stockersky
3个回答

10

在阅读Fabio Nelli的书《Python数据分析》时,我尝试使用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”这样的软件包。实际上,仓库中许多软件包在其名称中没有版本字符串;如果你忽略了它们作为依赖项,就会错过它们。

好吧,我想你可以更精确地过滤。我下载了大约6GB的软件包!

!!!! 不要从刚刚下载的仓库部分构建自定义渠道 !!!!(Anaconda自定义渠道) 我最初尝试了这个并遇到了这个异常:“RecursionError:calling Python对象时超出了最大递归深度。” 这是一个已知的问题: https://github.com/conda/conda/issues/2371 ==> 维护者正在讨论此事:维护在repodata.json和repodata.json.bz2中的元数据不反映单个pkg中的元数据。他们选择仅编辑仓库元数据以解决问题,而不是每个软件包元数据。 因此,如果你从软件包重新构建渠道元数据,你将会错过一些东西。

==> 所以:不要重新构建渠道元数据,只需保留仓库元数据(包含���官方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会找出。

更新:

conda update  -c file://resto/anaconda_repo/repo.continuum.io/pkgs/free/ --override-channels --all

等等,我想你可以使用系统用户的conda配置文件来强制使用这个本地频道。

希望有所帮助。

Guillaume


似乎拒绝所有pyXX文件。你知道问题出在哪里吗? - zoof

7
另一个选择是使用conda-pack
来自文档

在源机器上

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

  • 将位于显式路径 /explicit/path/to/my_env 的环境打包成 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


1
首先安装conda包:"conda install -c conda-forge conda-pack" - Vasco
1
如果源计算机是Windows 10,而目标计算机是Windows 7,这个能行吗? - user3731622

1
我有类似的情况,并想出了不同的解决方案 - 也许不太“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

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


优点:您无需下载整个频道离线,依赖项可以正常工作,最后(我不完全确定)- 对于非根环境,也许会使用本地缓存,这样可以节省一些互联网流量。但是 OP 建议当我们需要时,本地包缓存并不总是按照我们想要的方式工作。 - Tomasz Gandor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接