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

我已经安装并使用了 水蟒 Python 发行版,并且已经开始使用 Anaconda (Conda)环境。我可以使用标准的 conda install...命令将来自发行版的包放到我的环境中,但是如果要使用任何外部的东西(比如 Flask-WTF、 flask-sqlalky 和 alembic) ,我需要在活动环境中使用 pip install。但是,当我查看环境的内容时,无论是在目录中还是在使用 conda list时,都不会显示这些 pip installed 包。

使用 pip freezepip list只是列出了我曾经安装过的所有软件包。

是否有一种方法可以跟踪我的每一个水蟒 env(包括安装的 pipconda)中的内容?

121746 次浏览

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

  1. 你可以把 conda listpip freeze结合起来,用 conda(在 conda list中显示)和 conda软件包管理器来管理安装在 conda中的软件包,用 pip安装在 pip中的软件包(在 pip freeze中显示但在 conda list中没有显示)。

  2. 在您的环境中只安装 pythonpipdistribute软件包,并使用 pip管理所有内容。(如果你使用的是 Windows 操作系统,这并不是那么微不足道... ...)

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

我个人推荐第三种选择,因为构建 conda包非常容易。连续体的 github 帐户上有一个示例菜谱的 git 存储库。但它通常可以归结为:

 conda skeleton pypi PACKAGE
conda build PACKAGE

或者只是:

conda pipbuild PACKAGE

另外,当你已经建立了一次,你可以上传他们到 https://binstar.org/,只是从那里安装。

然后,您将使用 conda来管理所有事情。

Conda (new-PyPI-install)有一个分支,它添加了与 pip 和 PyPI 更好的集成。特别是 conda 列表还将显示 pip 安装的软件包,conda 安装将首先尝试找到一个 conda 软件包,失败后将使用 pip 来安装该软件包。

这个分支计划在本周晚些时候合并,以便 conda 的2.1版本能够更好地与 conda 进行 pip 集成。

我按照@Viktor Kerkez 的回答,结果喜忧参半

Conda 骨架 Pypi 包

Conda 构建程序包

看起来一切正常,但我不能成功导入程序包。最近,我在 蟒蛇用户组上询问了这个问题,并从@Travis Oliphant 那里听到了使用 conda 构建和管理不与 Anaconda 一起发布的软件包的最佳方法。您可以阅读这个线程 给你,但是我将描述下面的方法,希望使 OP 的问题的答案更加完整..。

示例: 我将使用 conda 2.2.5在 Windows 上安装优秀的 Pretylotlib 软件包

1a) conda build --build-recipe prettyplotlib

在构建的最后一个测试部分之前,您将看到构建消息看起来都很好

文件“ C: Anaconda conda-bld test-tmp _ dir run _ test.py”,第23行 Import None SyntaxError: 不能赋值给 Nothing TESTS FAILED: pretylotlib-0.1.3-py27 _ 0

1b) 进入/conda-foods/pretylotlib 并编辑 met.yaml 文件。目前,按照步骤1a 设置的包导致 yaml 文件在 test部分中出现错误。例如,下面是我的 prettyplotlib的样子

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

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

1c) 从1a 重新运行命令,这次应该没有任何错误。在构建结束时,您将被问及是否要将构建上传到 Binstar。我输入“否”,然后看到这条信息:

如果你想稍后将这个包上传到 binstar.org,输入:

$binstar load C: Anaconda conda-bld win-64 pretylotlib-0.1.3-py27 _ 0.tar. bz2

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 的这篇 最近的博客文章文章对于像我这样的人来说是有帮助的,因为我并不欣赏所有进入强大的 Python 包的东西,但是我肯定会欣赏那些“只是工作”的东西。康达看起来是个不错的选择。

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

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

conda env export > environment.yml

参考文献:

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

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

您基本上只需要找到环境“ bin/pip”文件夹的正确路径,并将其放在 install 命令之前。

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

这就是为什么我写了《挑剔: http://picky.readthedocs.io/

它是一个 python 包,可以跟踪在 viralenvs 和 conda envs 中安装了 pip 或 conda 的包。

我的 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文件中的所有包。

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

>pip install .

使用 setup.py 安装本地包, 它安装一个对于使用 相同的 版本的巨蟒。注意我使用的是 conda 版本的 pip!

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

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

如果我稍后使用 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 env,现在 conda 会看到它:

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

因此,我认为 conda 和 pip 之间的交互存在一些问题——例如,使用 pip 从一个 conda env 中安装一个本地软件包,使该软件包可用于同一 Python 版本的所有其他 conda env (但不能通过 conda list 看到)。

您可以从在 conda 环境中安装以下给定的命令开始:

conda install pip

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

在安装了导出环境的所有 conda 和 pip 包之后,使用:

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

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

使用您的环境的 pip 来安装这样的软件包

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

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