如何在 Anaconda (Conda) 环境中跟踪 pip 安装的软件包?

Posted

技术标签:

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

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

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

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

【问题讨论】:

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

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

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

    构建您自己的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-profilerconda install numba,它们都显示在~/anaconda/bin/pip freeze中。 “连续体 github 帐户上示例配方的 git 存储库”您的意思是 github.com/ContinuumIO/anaconda-recipes 吗?可以的话请给个链接 这实际上并没有安装包,因此您可以导入它。您必须按照***.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

参考资料:

https://github.com/conda/conda-env/ https://github.com/conda/conda-env/issues/12

【讨论】:

【参考方案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 包

【讨论】:

以上是关于如何在 Anaconda (Conda) 环境中跟踪 pip 安装的软件包?的主要内容,如果未能解决你的问题,请参考以下文章

Anaconda-- conda 创建、激活、退出、删除虚拟环境(转)

配置conda环境

如何使用 conda 环境为 anaconda spyder 设置不同的桌面启动器?

conda 创建/删除/重命名 环境

如何在vs2017管理anaconda的python包

【Anaconda】conda创建虚拟环境不报错,但是虚拟环境无法生成的解决办法