康达能否取代对virtualenv的需求?


205

我在安装SciPy时遇到了麻烦,最近发现了Conda,特别是在我正在开发的Heroku应用程序上。

使用Conda,您可以创建与virtualenv十分相似的环境。我的问题是:

  1. 如果我使用Conda,它将取代对virtualenv的需求吗?如果没有,如何将两者一起使用?是否在Conda中安装virtualenv或在virtualenv中安装Conda?
  2. 我还需要使用点子吗?如果是这样,我仍然可以在隔离的环境中使用pip安装软件包吗?

如果您有兴趣在Heroku上使用conda和pip,请参见github.com/faph/conda-pip-buildpack
faph 2015年

谢谢。我注意到github上有很多用于Heroku的conda buildpack。决定使用哪个buildpack时应考虑哪些因素?
克里兹(Kritz)

请注意,如果要安装Continuum服务器直接不提供的软件包,则仍然需要使用pip。
ali_m 2015年

是的,我看到它们仍在Django 1.8(而非1.9)上。目前,我将在需要的地方使用conda(scipy和numpy),将pip用于其他所有内容-但仍在conda中。
克里茨(Kritz)

我认为大多数conda Heroku构建包都来自Kenneth Reitz。人们会根据自己的喜好进行调整。只需检查它们是否同时包含conda和pip支持即可。并且是否支持environment.yml文件。您始终可以快速浏览buildpack代码,以查看是否喜欢构建脚本,例如查看如何精确创建环境。
faph 2015年

Answers:


157
  1. 康达取代了virtualenv。我认为这更好。它不仅限于Python,还可以用于其他语言。以我的经验,它提供了更加流畅的体验,尤其是对于科学包装。我第一次在Mac上正确安装MayaVi是使用conda

  2. 您仍然可以使用pip。实际上,conda安装pip在每个新环境中。它知道有关pip安装的软件包的信息。

例如:

conda list

列出当前环境中所有已安装的软件包。Conda安装的软件包显示如下:

sphinx_rtd_theme          0.1.7                    py35_0    defaults

并通过安装的pip带有<pip>标记:

wxpython-common           3.0.0.0                   <pip>

8
在Anaconda环境中使用pip是否有负面影响?即使有通过Conda提供的软件包,您是否还会使用pip?
clifgray

连字符与下划线的区别是什么?如果软件包名称都没有该怎么办?那如何区分​​呢?
汤姆·黑尔'18

1
下划线或连字符是软件包名称的一部分。这与pip或conda无关。将<pip>它与PIP安装显示否则安装与畅达。
迈克·米勒

4
有一个很大的警告“ conda知道pip安装的软件包”。据我了解,在conda env中,pip是独立运行的,因此conda无法卸载pip安装的软件包,例如
information_interchange

1
@clifgray-具有本机共享库的pip和conda程序包可能会安装二进制不兼容版本的二进制文件,这些版本将开始引起各种本机世界故障(sigsegv-s等)的困扰,从而难以为不使用C调试器的人调试。与仅使用python的软件包相同,只是这些易于理解。
bobah


34

虚拟环境和 pip

我会补充说,使用Anaconda可以轻松创建删除 conda环境。

> conda create --name <envname> python=<version> <optional dependencies>

> conda remove --name <envname> --all 

激活的环境中,通过conda或安装软件包pip

(envname)> conda install <package>

(envname)> pip install <package>

这些环境与conda的pip式软件包管理紧密相关,因此创建环境以及安装Python和非Python软件包都很简单。


朱皮特

此外,在环境中安装ipykernel在Jupyter笔记本的“内核”下拉菜单中会添加一个新列表,从而将可复制的环境扩展到笔记本。从Anaconda 4.1开始,添加了nbextensions,更轻松地为笔记本添加了扩展名。

可靠性

以我的经验,conda在安装大型库(例如numpy和)时更快,更可靠pandas。此外,如果您希望转移环境的保留状态,则可以通过共享克隆环境来实现。


18

安装Conda将使您能够根据需要创建和删除python环境,从而为您提供与virtualenv相同的功能。

对于这两种发行版,您将能够创建一个隔离的文件系统树,在其中您可以根据需要安装和删除python软件包(可能是pip)。如果您想为不同的用例使用同一个库的不同版本,或者只想尝试进行一些发行并将其删除以节省磁盘空间,则可能会派上用场。

差异:

许可协议。虽然virtualenv已获得MIT最宽松的许可证,但Conda使用3条款BSD许可。

康达为您提供了自己的包装控制系统。这个程序包控制系统通常提供流行的非python软件的预编译版本(对于大多数流行的系统),这可以很容易地使某些机器学习程序包正常工作。也就是说,您不必为系统编译优化的C / C ++代码。虽然这对我们大多数人来说是一个很大的缓解,但它可能会影响此类库的性能。

与virtualenv不同,Conda至少在Linux系统上复制了一些系统库。该库可能不同步,从而导致程序行为不一致。

判决:

Conda很棒,应该是您开始机器学习之路的默认选择。它将为您节省一些时间,使他们无法使用gcc和许多软件包。但是,Conda并没有取代virtualenv。它引入了一些额外的复杂性,而这些复杂性可能并非总是需要的。它具有不同的许可。您可能要避免在分布式环境或HPC硬件上使用conda。


2
为什么还要详细说明为什么“您可能要避免在分布式环境或HPC硬件上使用conda”?@ y.selivonchyk
Oliver Hu

1
我不同意其中的一些结论。“程序行为不一致”是由于未正确配置程序以使用已conda安装的软件和库而导致的。在HPC中,conda在许多情况下更可取,实际上,HPC管理员正在使用它来替换module系统之类的东西。它允许用户安装软件和更好的软件隔离性,这是HPC上的两个大问题。我遇到的唯一警告是,许多HPC文件系统对目录中文件的数量有硬限制,而conda会创建1000个文件。
user5359531

9

我同时使用和(截至2020年1月)它们具有一些肤浅的差异,因此适合我的不同用法。通过默认康达更喜欢在一个中央位置来管理你的环境的列表,而使得的virtualenv在当前目录中的文件夹。前者(集中式)在您进行机器学习时才有意义,例如,您有几个广泛的环境可用于许多项目,并且想从任何地方跳入其中。如果您正在做一些一次性项目,这些项目具有完全不同的lib需求集,而lib需求集实际上更多地属于项目本身,则后者(每个项目文件夹)才有意义。

Conda创建的空环境约为122MB,而virtualenv约为12MB,因此,这是您可能不希望将Conda环境分散在各处的另一个原因。

最后,表明Conda偏爱其集中式env的另一个表面现象是(同样,默认情况下),如果您确实在自己的项目文件夹中创建了一个Conda env并激活它,则出现在外壳中的名称前缀是(太长)绝对值文件夹的路径。您可以通过给它命名来解决该问题,但是virtualenv默认情况下做对了。

我希望随着两个程序包管理者争夺霸主地位,此信息会迅速过时,但这是今天的权衡:)


很好的解释!您在使用两者时都遇到困难吗?你有没有用过pipenv
6

8

Pipenv是另一个新的选择,也是我当前首选的启动和运行环境的方法。

目前,它是Python.org官方推荐的Python打包工具


1
这促使“嗯?什么是pipenv?”,这使我reddit.com/r/Python/comments/8jd6aq/...sedimental.org/the_packaging_gradient.html。我仍然不知道该使用什么,但至少我会更好地了解。我认为。
马特·威尔基18'Aug

看完介绍并快速阅读介绍后,pipenv似乎无法管理Python版本...
Carles Alcolea

@CarlesAlcolea pipenv也可以通过以下方式指定各种版本:pipenv --two对于Python2和pipenv-对于python3为3
Kurian Benoy

3

是的,conda它比容易安装得多virtualenv,并且几乎可以替代后者。


6
为什么Anaconda会提供替换虚拟环境的安装说明?
jmh

1
@jmh Anaconda不会替换虚拟环境,而是使用virtualenv更通用的虚拟环境管理工具替换了特定于Python的虚拟环境管理工具conda。另外,Anaconda只是一个Python +发行版,其中包括Conda工具。问题(和答案)仅与Conda有关。
merv

3
除了几年前的答案以外,这个答案没有添加任何其他内容。
merv

1

我在公司工作,在几台没有管理员权限的计算机的防火墙后面

以我有限的python使用经验(两年),我遇到了几个库(JayDeBeApi,sasl),这些库通过pip安装时会抛出C ++依赖项错误错误:需要Microsoft Visual C ++ 14.0。使用“ Microsoft Visual C ++生成工具”获得它:http : //landinghub.visualstudio.com/visual-cpp-build-tools

这些用conda安装得很好,因此从那以后,我开始使用conda env。但是要阻止conda从c.programfiles里面安装依赖项并不容易,因为我没有写权限。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.