如何在 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 install
ed 包都不会出现。
使用pip freeze
和pip list
只会列出我曾经安装过的每个包。
有没有办法跟踪我的每个 Anaconda env
s 中的内容(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 是否会在更新时删除自己的索引(表现不佳)?
【参考方案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 list
和 pip freeze
并使用 conda
包管理器管理使用 conda
安装的包(显示在 conda list
中)和与pip
一起安装(显示在pip freeze
但不在conda list
中)和pip
。
仅在您的环境中安装python
、pip
和distribute
软件包并使用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-profiler
和conda 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 <env-name> > environment.yml
这将在文件夹中创建所需的文件
【讨论】:
【参考方案10】:我的which pip
显示以下路径:
$ which pip
/home/kmario23/anaconda3/bin/pip
所以,无论我使用pip install <package-name>
安装的哪个包,当使用以下命令导出列表时,都必须反映在包列表中:
$ 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 创建、激活、退出、删除虚拟环境(转)