转载:克隆他人环境后随意pip不影响原环境

我只是carnd-term1-gpu使用tensorflow版本'0.12.1' 克隆了一个具有tensorflow且可以正常工作的miniconda环境。环境中还安装了许多其他python软件包。我想升级到最新版本的tensorflow,因此我基于tensorflow Ubuntu进行了以下操作

1)将现有的工作环境克隆为 tflow

<span style="color:#333333"><code>conda create --name tflow --clone carnd-term1-gpu</code></span>

这成功完成了。

2)源激活tflow并使用pip安装

<span style="color:#333333"><code>source activate tflow
(tflow) xx@pc:~$ pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.1.0-cp35-cp35m-linux_x86_64.whl</code></span>

现在,我尝试运行旧环境,并假设不应更改它。

<span style="color:#333333"><code>source activate carnd-term1-gpu
ipython</code></span>

然后从ipython提示符下键入import numpy as np并获取以下信息:

<span style="color:#333333"><code>---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-4ee716103900> in <module>()
----> 1 import numpy as np

/home/ai/miniconda3/envs/carnd-term1-gpu/lib/python3.5/site-packages/numpy/__init__.py in <module>()
    140         return loader(*packages, **options)
    141 
--> 142     from . import add_newdocs
    143     __all__ = ['add_newdocs',
    144                'ModuleDeprecationWarning',

/home/ai/miniconda3/envs/carnd-term1-gpu/lib/python3.5/site-packages/numpy/add_newdocs.py in <module>()
     11 from __future__ import division, absolute_import, print_function
     12 
---> 13 from numpy.lib import add_newdoc
     14 
     15 ###############################################################################

/home/ai/miniconda3/envs/carnd-term1-gpu/lib/python3.5/site-packages/numpy/lib/__init__.py in <module>()
      6 from numpy.version import version as __version__
      7 
----> 8 from .type_check import *
      9 from .index_tricks import *
     10 from .function_base import *

/home/ai/miniconda3/envs/carnd-term1-gpu/lib/python3.5/site-packages/numpy/lib/type_check.py in <module>()
      9            'common_type']
     10 
---> 11 import numpy.core.numeric as _nx
     12 from numpy.core.numeric import asarray, asanyarray, array, isnan, \
     13                 obj2sctype, zeros

/home/ai/miniconda3/envs/carnd-term1-gpu/lib/python3.5/site-packages/numpy/core/__init__.py in <module>()
     51 from . import shape_base
     52 from .shape_base import *
---> 53 from . import einsumfunc
     54 from .einsumfunc import *
     55 del nt

ImportError: cannot import name 'einsumfunc'</code></span>

我以为我可以通过克隆一个单独的环境并仅更改该环境来获得保护,但是似乎在一个环境中进行安装会更改另一环境中的行为。正是我所想避免的!出了什么问题,我该如何解决?到目前为止,新环境似乎运行良好。

我检查了两种环境中的文件日期。该carnd-term1-gpu环境中包含的文件的日期与我在该tflow环境中进行升级的日期相同。关于如何发生的任何想法?

我尝试将丢失的文件添加einsumfunc.py到我的carnd-term1-gpu环境中,然后再次启动Ipython。这次当我import numpy as np执行其他文件时,无法导入。因此,看来我的carnd-term1-gpu环境已损坏。

比较conda list每种环境并仅查看numpy,我看到以下内容:对于tflow 环境:

<span style="color:#333333"><code>numpy                     1.11.3                    <pip>
numpy                     1.12.1                    <pip>
numpy                     1.11.3          py35_blas_openblas_200  [blas_openblas]  conda-forge</code></span>

对于carnd-term1-gpu环境:

<span style="color:#333333"><code>numpy                     1.11.3                    <pip>
numpy                     1.11.3          py35_blas_openblas_200  [blas_openblas]  conda-forge</code></span>

然后,我使用来查看修订conda list --revisions。两种环境仅显示的单个修订版rev 0。同样,conda-meta/history仅查看会显示的原始创建日期:1月13 carnd-term1-gpu日和5月9日tflow。因此,此版本的pip组合:

<span style="color:#333333"><code>pip                       9.0.1                    py35_0    conda-forge</code></span>

结合这个轮子:

<span style="color:#333333"><code>https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.1.0-cp35-cp35m-linux_x86_64.whl</code></span>

不知何故破坏了环境carnd-term1-gpu。这似乎是一个错误,还是我以某种方式从tensorflow站点损坏了轮子?如果是较晚版本,它将如何破坏不同于所安装环境的环境?在两种环境中,pip的注释版本相同。

我做了以下调查以了解在安装日期哪些文件发生了变化。

<span style="color:#333333"><code>find /home/ai/miniconda3/envs/carnd-term1-gpu/  -type f -newermt 2017-05-09 -ls | wc -l</code></span>

这表明创建/修改了669个文件。这些大多是在/site-packages/numpy/,但是six.pypyparsing.py/setuptools//pkg_resources/easy_install.py/werkzeug/也受到了影响。

conda --version 是4.2.12

我尝试了以下方法以使旧环境再次恢复正常。

<span style="color:#333333"><code>conda env export > environment.yml
conda env create -f environment.yml -n sdc-gpu</code></span>

这导致以下错误:

<span style="color:#333333"><code>Could not import setuptools which is required to install from a source distribution.
Traceback (most recent call last):
  File "/home/ai/miniconda3/envs/sdc-gpu/lib/python3.5/site-packages/pip/req/req_install.py", line 387, in setup_py
    import setuptools  # noqa
  File "/home/ai/miniconda3/envs/sdc-gpu/lib/python3.5/site-packages/setuptools/__init__.py", line 12, in <module>
    import setuptools.version
  File "/home/ai/miniconda3/envs/sdc-gpu/lib/python3.5/site-packages/setuptools/version.py", line 1, in <module>
    import pkg_resources
  File "/home/ai/miniconda3/envs/sdc-gpu/lib/python3.5/site-packages/pkg_resources/__init__.py", line 70, in <module>
    import packaging.version
ImportError: No module named 'packaging'

CondaValueError: Value error: pip returned an error.</code></span>

 

解决方案


我从连续体中得到了以下几点; “要避免这种情况发生,您必须--copy在克隆操作中使用该标志。conda设计的核心是广泛使用硬链接。这个确切的问题是最大的陷阱之一。”

因此,如果我在第一次克隆环境时会执行以下操作,则可以避免破坏旧环境:

conda create --name tflow --copy --clone carnd-term1-gpu

该选项 --copy Install all packages using copies instead of hard- or soft-link‐ing将阻止pip覆盖文件。

有关此问题以及将来如何解决的一些持续讨论在这里:conda pip breaks

我要恢复的唯一选择是重新安装每个损坏的软件包。当心使用点子与conda ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值