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

2024-04-16 12:08:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在无法访问internet的生产服务器上部署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系统,安装的是普通的水蟒,而不是迷你水蟒


Tags: 服务器目录apipackage环境uselocal部署
3条回答

好吧,在阅读Fabio Nelli的《Python数据分析》一书时,我和熊猫玩过之后,我意识到有多少熊猫是一个很棒的库。 所以,我一直在和水蟒合作,让它在我的环境中工作。

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

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

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

我用wget镜像了水蟒存储库的一部分: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的包裹!

!!!!不要从您刚刚下载的存储库部分构建自定义频道!!!!(Python自定义频道) 我首先尝试了这个方法,但出现了一个异常:“RecursionError:调用Python对象时超过了最大递归深度”。 这是已知的pb: https://github.com/conda/conda/issues/2371 ==>;维护人员讨论了这一点:repodata.json和repodata.json.bz2中维护的元数据不反映单个pkg中的元数据。他们选择只编辑repo元数据来修复问题,而不是每个包元数据。 因此,如果从包中重建通道元数据,则会丢失。

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

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 省略你的arch(在我的例子中是linux-64)。康达会发现的。

更新:

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

等等。。。 我想,您可以使用系统用户的conda conf文件强制使用这个本地通道。

希望有帮助。

纪尧姆

我有一个类似的情况,并提出了一个不同的解决方案-也许更少的'Python'('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 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目录,需要特别处理(例如,envs只符号链接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

这对我来说很有效,但我建议您在进行这样的实验之前备份一下生产环境。

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

On the source machine

  • Pack environment my_env into my_env.tar.gz
    $ conda pack -n my_env

  • Pack environment my_env into out_name.tar.gz
    $ conda pack -n my_env -o out_name.tar.gz

  • Pack environment located at an explicit path into my_env.tar.gz
    $ conda pack -p /explicit/path/to/my_env

On the target machine

  • Unpack environment into directory my_env
    $ mkdir -p my_env
    $ tar -xzf my_env.tar.gz -C my_env

  • Use python without activating or fixing the prefixes.
    Most python libraries will work fine, but things that require prefix cleanups will fail.
    $ ./my_env/bin/python

  • Activate the environment. This adds my_env/bin to your path
    $ source my_env/bin/activate

  • Run python from in the environment
    (my_env)$ python

  • Cleanup prefixes from in the active environment.

  • Note that this command can also be run without activating the environment
  • as long as some version of python is already installed on the machine.
    (my_env)$ conda-unpack

  • At this point the environment is exactly as if you installed it here

  • using conda directly. All scripts should work fine.
    (my_env)$ ipython --version

  • Deactivate the environment to remove it from your path
    (my_env)$ source my_env/bin/deactivate

相关问题 更多 >