【问题标题】:How do I keep track of pip-installed packages in an Anaconda (Conda) environment?如何在 Anaconda (Conda) 环境中跟踪 pip 安装的软件包?
【发布时间】:2013-09-09 12:32:43
【问题描述】:

我已经安装并一直在使用Anaconda Python 发行版,并且我已经开始使用 Anaconda (Conda) 环境。我可以使用标准的conda install... 命令将分发包中的包放入我的环境中,但要使用外部的任何东西(即 Flask-WTF、flask-sqlalchemy 和 alembic),我需要在活动环境中使用pip install。但是,当我查看环境的内容时,无论是在目录中,还是使用conda list,这些pip installed 包都不会出现。

使用pip freeze 和pip list 只会列出我曾经安装过的每个包。

有没有办法跟踪我的每个 Anaconda envs 中的内容(pip 和 conda 都已安装)?

【问题讨论】:

  • 使用pip 与conda 一起安装,例如~/anaconda/bin/pip。使用它将软件包安装到conda 环境中,以及查看使用此pip 和conda install 安装的软件包的联合。
  • conda list 已经有一段时间包含通过其他方式安装的 python 包(例如 pip、easy-install、直接使用 python setup.py install 等)
  • 不要升级你的点子,否则这个出口会被淹没
  • @andrew-cassidy 你能解释一下吗?有时当我执行conda update --all 时,它也会更新点子。我们无法轻易阻止 pip 更新的发生。 pip 是否会在更新时删除自己的索引(表现不佳)?

标签: python pip anaconda env conda


【解决方案1】:

conda-env 现在会自动执行此操作(如果 pip 与 conda 一起安装)。

您可以使用用于迁移环境的导出工具了解其工作原理:

conda env export -n <env-name> > environment.yml

该文件将列出 conda 包和 pip 包:

name: stats
channels:
  - javascript
dependencies:
  - python=3.4
  - bokeh=0.9.2
  - numpy=1.9.*
  - nodejs=0.10.*
  - flask
  - pip:
    - Flask-Testing

如果您希望继续导出环境,请将 environment.yml 移动到新主机并运行:

conda env create -f path/to/environment.yml

【讨论】:

  • 只是为了让未来的读者明白这一点:-pip: 部分标记了所有通过 pip 安装的包。此外,据我所知,conda env export 永远不会生成 semvar 匹配值,就像本例中显示的 -nodejs=0.10.* 一样。它将给出一个明确的值,如-nodejs=0.10.1,如果你想要的话,你需要输入*。如果它能够处理 semvar 匹配,那就太棒了,我很高兴听到如何让这种魔法发生。 :)
  • 我发现了失败的情况,出现“ResolvePackageNotFound”错误。它是通过在创建 yml 文件的命令中添加 --from-history 来解决的。
【解决方案2】:

conda 只会跟踪它安装的包。而pip 将为您提供使用pip 安装程序本身安装的软件包,或者他们在setup.py 中使用setuptools 的软件包,因此conda build 生成了egg 信息。所以你基本上有三个选择。

  1. 您可以联合使用 conda list 和 pip freeze 并使用 conda 包管理器管理使用 conda 安装的包(显示在 conda list 中)和与pip 一起安装(显示在pip freeze 但不在conda list 中)和pip。

  2. 仅在您的环境中安装python、pip 和distribute 软件包并使用pip 管理所有内容。 (如果你在 Windows 上,这不是那么简单......)

  3. 构建您自己的conda 包,并使用conda 管理所有内容。

我个人会推荐第三个选项,因为它很容易构建conda 包。在 continuum 的 github 帐户上有一个示例配方的 git 存储库。但它通常归结为:

 conda skeleton pypi PACKAGE
 conda build PACKAGE

或者只是:

conda pipbuild PACKAGE

此外,当您构建它们一次后,您可以将它们上传到 https://binstar.org/ 并从那里安装。

然后您将使用conda 管理所有内容。

【讨论】:

  • 我刚试过~/anaconda/bin/pip install memory-profiler和conda install numba,它们都显示在~/anaconda/bin/pip freeze中。
  • “连续体 github 帐户上示例配方的 git 存储库”您的意思是 github.com/ContinuumIO/anaconda-recipes 吗?可以的话请给个链接
  • 这实际上并没有安装包,因此您可以导入它。您必须按照stackoverflow.com/a/20750388/125507 中所述执行conda install C:\...PACKAGE-0.0.0-py27_0.tar.bz2
  • 我会说首先在您的 conda 环境中始终拥有conda install python=3.x.y,以便后续 pip 安装通过 conda installed pip。
  • 这个答案(编辑于 2014 年 6 月 17 日 11:36 由 Viktor Kerkez 于 2013 年 9 月 5 日 15:40 回答)现已过时。 @conner.xyz 上面的完整答案(2015 年 11 月 13 日 14:21 回答)提供了更准确和最新的答案。
【解决方案3】:

conda 的一个分支(new-pypi-install)增加了与 pip 和 PyPI 的更好集成。特别是 conda list 还将显示 pip 安装的包, conda install 将首先尝试找到一个 conda 包,失败将使用 pip 安装包。

这个分支计划在本周晚些时候合并,以便 conda 2.1 版与 conda 有更好的 pip-integration。

【讨论】:

  • 我想指出,这已经在 conda 2.2.3 中工作(可能在此之前)。它的工作方式是,如果您尝试 conda install package 并且找不到 conda 配方,它会尝试通过 pip 安装它(然后跟踪它)。如果不在您的环境中,它甚至建议安装pip。感谢 Travis 所做的一切工作!
  • 澄清,因为我已经误读了好几次了。 @Travis 的意思是我认为如果一个在 conda 中运行,那么运行 pip 将首先搜索 conda 包?反过来肯定不正确—— conda install 不查找 pypi 包,甚至不查找 pypi.binstar.org 上的项目。这是从 conda 3.5.2 开始的。
  • 这个被删除了吗?如果我运行conda install autopep8,它会告诉我“找不到包”,我应该手动搜索 anaconda.org。
  • @AnneTheAgile running pip... 也不起作用,它根本不会寻找 conda 包。
【解决方案4】:

我遵循@Viktor Kerkez 的回答并取得了喜忧参半的成功。我发现有时这个食谱的

conda 骨架 pypi 包

conda 构建包

看起来一切正常,但我无法成功导入 PACKAGE。最近我在Anaconda user group 上询问了这个问题,并从@Travis Oliphant 本人那里听到了关于使用 conda 构建和管理不随 Anaconda 提供的软件包的最佳方法。您可以阅读此线程 here,但我将在下面描述该方法,以希望使 OP 问题的答案更加完整...

示例:我将使用 conda 2.2.5 在 Windows 上安装出色的 prettyplotlib package。

1a) conda build --build-recipe prettyplotlib

在构建的最后 TEST 部分之前,您会看到构建消息看起来都很好。我看到了这个错误

文件“C:\Anaconda\conda-bld\test-tmp_dir\run_test.py”,第 23 行 import None SyntaxError: cannot assign to None TESTS FAILED: prettyplotlib-0.1.3-py27_0

1b) 进入 /conda-recipes/prettyplotlib 并编辑 meta.yaml 文件。目前,在步骤 1a 中设置的包会导致 yaml 文件在 test 部分中有错误。例如,这是我的查找prettyplotlib

test:   # Python imports   imports:
    - 
    - prettyplotlib
    - prettyplotlib

编辑此部分以删除前面的空行 - 并删除多余的 prettyplotlib 行。在撰写本文时,我发现我需要为使用 conda 安装的外部包编辑大多数 meta.yaml 文件,这意味着有一个空白导入行导致错误以及给定包的冗余导入.

1c) 重新运行 1a 中的命令,这一次应该没有错误地完成。在构建结束时,系统会询问您是否要将构建上传到binstar。我输入否,然后看到这条消息:

如果您想稍后将此包上传到 binstar.org,请输入:

$ binstar 上传 C:\Anaconda\conda-bld\win-64\prettyplotlib-0.1.3-py27_0.tar.bz2

该 tar.bz2 文件是您现在需要实际安装的构建。

2) conda install C:\Anaconda\conda-bld\win-64\prettyplotlib-0.1.3-py27_0.tar.bz2

按照这些步骤,我已成功使用 conda 安装了许多 Anaconda 未附带的软件包。以前,我使用 pip 安装了其中一些,所以在使用 conda 安装 PACKAGE 之前我做了pip uninstall PACKAGE。使用 conda,我现在可以用一种方法管理(几乎)我所有的包,而不是使用 conda、pip、easy_install 和 python setup.py install 安装混合的东西。

就上下文而言,我认为@Travis Oliphant 的recent blog post 对于像我这样不欣赏强大的 Python 包装中的所有内容但肯定会欣赏“正常工作”的人会有所帮助。 conda 似乎是一个很好的前进方向......

【讨论】:

  • 使用 conda 3.5.2 版本,命令 $ conda build --build-recipe XXX ; “无法识别的参数:--build-recipe”出错。完整的回应是;用法:conda-build [-h] [-c] [--no-binstar-upload] [--output] [-s] [-t] [--no-test] [-V] [-q] RECIPE_PATH [RECIPE_PATH ...] conda-build:错误:无法识别的参数:--build-recipe
  • 这个答案(2013 年 12 月 23 日 20:04 Josh Hemann 回答)现在已经过时了。 @conner.xyz 上面的完整答案(2015 年 11 月 13 日 14:21 回答)提供了更准确和最新的答案。
【解决方案5】:

这就是我写 Picky 的原因:http://picky.readthedocs.io/

它是一个 python 包,用于跟踪在 virtualenvs 和 conda envs 中使用 pip 或 conda 安装的包。

【讨论】:

    【解决方案6】:

    我认为这里缺少的是当你这样做时:

    >pip install .
    

    使用 setup.py 安装本地包, 它安装了一个对 all 使用的 conda env 可见的包 与python 相同的版本。注意我使用的是 pip 的 conda 版本!

    例如,如果我使用的是 python2.7,它会将本地包放在这里:

    /usr/local/anaconda/lib/python2.7/site-packages

    如果我稍后使用 python=2.7(= 默认值)创建一个新的 conda env:

    >conda create --name new
    
    >source activate new
    

    然后做:

    (new)>conda list    // empty - conda is not aware of any packages yet
    

    但是,如果我这样做:

    (new)>pip list      // the local package installed above is present
    

    所以在这种情况下,conda 不知道 pip 包,但该包可用于 python。

    但是,如果我改为安装本地软件包(再次使用 pip) 我已经创建(并激活)了新的 conda 环境,现在 conda 会看到它:

    (new)>conda list   // sees that the package is there and was installed by pip
    

    所以我认为 conda 和 pip 之间的交互存在一些问题 - 即,使用 pip 从一个 conda env 中安装本地包使得该包可用于(但不能通过 conda 列表看到)相同的所有其他 conda env python版本。

    【讨论】:

      【解决方案7】:

      conda env export 列出环境中的所有 conda 和 pip 包。 conda-env 必须安装在 conda 根目录 (conda install -c conda conda-env)。

      要编写描述当前环境的environment.yml 文件:

      conda env export > environment.yml
      

      参考资料:

      【讨论】:

        【解决方案8】:

        我通常在“pip”命令之前为要安装软件包的特定环境添加“bin/pip”文件夹的前缀。例如,如果你想在环境 py34 中安装 pymc3,你应该使用这个命令:

        ~/anaconda/envs/py34/bin/pip install git+https://github.com/pymc-devs/pymc3 
        

        你基本上只需要找到你的环境'bin/pip'文件夹的正确路径并将它放在安装命令之前。

        【讨论】:

          【解决方案9】:

          您可以首先在 conda 环境中安装以下给定命令:

          conda install pip

          然后在环境中安装你需要的所有 pip 包。

          安装所有conda和pip包后导出环境使用:

          conda env export -n &lt;env-name&gt; &gt; environment.yml

          这将在文件夹中创建所需的文件

          【讨论】:

            【解决方案10】:

            我的which pip 显示以下路径:

            $ which pip
            /home/kmario23/anaconda3/bin/pip
            

            所以,无论我使用pip install &lt;package-name&gt; 安装的哪个包,当使用以下命令导出列表时,都必须反映在包列表中:

            $ conda list --export > conda_list.txt
            

            但是,我没有。因此,我使用了其他几个人建议的以下命令:

            # get environment name by
            $ conda-env list
            
            # get list of all installed packages by (conda, pip, etc.,)
            $ conda-env export -n <my-environment-name> > all_packages.yml
            # if you haven't created any specific env, then just use 'root'
            

            现在,我可以看到我的all-packages.yml 文件中的所有包。

            【讨论】:

              【解决方案11】:

              使用你环境的 pip 来安装这样的包

              ~/anaconda3/envs/<ENV_NAME_HERE>/bin/pip install <PACKAGE_NAME>
              

              这应该有助于 conda 在您使用 conda list 时跟踪您安装的所有 pip 包

              【讨论】:

                猜你喜欢
                • 2020-03-13
                • 2017-04-24
                • 2021-08-04
                • 2019-07-01
                • 1970-01-01
                • 1970-01-01
                • 2018-11-17
                • 2022-08-03
                • 2019-09-02
                相关资源
                最近更新 更多