Ubuntu下python选择pip install还是conda install更加合适?
Ubuntu下python选择pip install还是conda install更加合适?
最近刚入门linux, 之前都是在win上用pycharm结合conda install来管理包,觉得也还很方便,但是也有很多人用pip。想请教一下ubuntu下更加推荐哪个?优缺点各有什么?(主要应用是tensorflow) 谢谢!
Conda和pip通常被认为几乎完全相同。虽然这两个工具的某些功能重叠,但它们设计用于不同的
目的。
Pip是Python Packaging Authority推荐的用于从Python Package Index安装包的工具。 Pip安装打包为wheels或源代码分发的Python软件。后者可能要求系统安装兼容的编译器和库。
Conda是跨平台的包和环境管理器,可以安装和管理来自Anaconda repository以 Anaconda Cloud的conda包。 Conda包是二进制文件,需要使用编译器来安装它们。另外,conda包不仅限于Python软件。它们还可能包含C或C ++库,R包或任何其他软件。
这是conda和pip之间的关键区别。 Pip安装Python包,而conda安装包可能包含用任何语言编写的软件的包。在使用pip之前,必须通过系统包管理器或下载并运行安装程序来安装Python解释器。而Conda可以直接安装Python包以及Python解释器。
另一区别是conda能够创建可以包含不同版本的Python或其他软件包的隔离环境。在使用数据科学工具时,这非常有用,因为不同的工具可能包含冲突的要求,这些要求可能会阻止它们全部安装到单个环境中。 Pip没有内置的环境支持,而是依赖于virtualenv或ref=“https://docs.python.org/3/library/venv.html”>venv 等其他工具来创建隔离环境。 pipenv,poetry和hatch wrap pip和virtualenv等工具提供了统一的方法来处理这些环境。
Pip和conda在如何实现环境中的依赖关系方面也有所不同。安装包时,pip会在递归的串行循环中安装依赖项。没有努力确保同时满足所有包的依赖性。如果较早安装的软件包与稍后安装的软件包具有不兼容的依赖性版本,则可能导致破坏的环境。conda使用可确保满足环境中安装的所有包的所有要求。此检查可能需要额外的时间,但有助于防止创建破坏的环境,前期关于依赖关系包的元数据是正确的。
考虑到conda和pip之间的相似性,有些人试图将这些工具结合起来创建数据科学环境也就不足为奇了。将pip与conda结合的主要原因是有些包只能通过pip安装。 Anaconda创酷提供超过1,500个软件包,包括最流行的数据科学,机器学习和AI框架。这些,以及包括conda-forge和bioconda在内的数据通过Anaconda云提供的数千个附加软件包,可以使用conda进行安装。尽管有大量的软件包,但与PyPI上提供的150,000多个软件包相比,它仍然很小。有时候需要的包没有conda包,但在PyPI上有,可以用pip安装。
参考资料:
类别 | conda | pip |
---|---|---|
管理 | 二进制 | wheel 或源码 |
需要编译器 | no | yes |
语言 | any | Python |
虚拟环境 | 支持 | 通过 virtualenv或venv等支持 |
依赖性检查 | yes | 屏幕提示用户选择包 |
来源 | Anaconda repo和cloud | PyPi |
-
ubuntu 下推荐 pip,可选库要大得多。
-
windows 下推荐 conda install,省心些。
个人推荐使用Anaconda,尤其是做机器学习相关领域的。
-
Anaconda集成了大多数常用的科学计算的包(其中还包括对于mkl的支持,还有自带的numba jit)
-
conda的包兼容性更好,更不容易出问题(毕竟是作为发行版在维护)
-
可以很方便的使用各种不同版本的Python,迁移新版本的Python也非常方便
-
自带很多依赖的二进制库,不需要root权限就能安装,比如boost,cuda,cudnn等等。tensorflow的GPU支持基本上即装即用,配置简单很多
-
不管你系统环境如何多变,直接装Anaconda,环境配置基本没啥差别
-
你依然可以使用pip。但是,尽量使用conda安装,尤其是那些需要编译的pip包,因为编译时可能会用到系统的lib,它的版本可能和conda的运行时不一致,容易出问题
-
conda还能安装gcc和cmake
如果Anaconda有缺点的话,我觉得最大的问题就是它实在太大了,有些二进制包也是很大(比如mkl,cuda)。但这些对于机器学习来说,这些都是很必要的存在。如果你没有这个需求,建议直接安装miniconda。
一个额外的建议:不要使用太古老的Linux发行版,美其名曰为了稳定。因为glibc版本太低的话,你将会面临非常非常多的问题,大多数预编译的包都可能无法安装。
建议使用pip来安装python的包。
一,因为在选择pip和conda时,除了包安装的选择,还要考虑到要使用什么venv环境,有pip通常与virtualenv,conda系通常与env(使用python迟早是要为多种环境烦恼的),而我认为conda的环境管理非常糟糕,要是与virtualenv混用容易炸掉两边的环境。
二,在install方面,conda安装包除了自带数据研究大礼包,安装方便以外没什么别的好处,这方面pip想要和conda一样一把梭的话,只需要找到一个完整的requirements.txt或者pipfile就好。而论库的大和全,pip是肯定要更强大的。
另外在选择pip后,进一步你可以选择使用pyenv来管理python版本,pipenv来管理项目的包,这是目前就我来说的best practice。当然一般情况下,pip+virtualenv够用了。
PS:新手在习惯pip后,不要因为pip很好用,就用pip来管理系统中的非python包,系统软件管理应该交给系统的包管理器如apt、pacman来完成,pip安装非python包有时候会与包管理器冲突。更重要的是官方包管理器中的包通常都是经过审核的,pip包安装容易被人夹带私货,具体案例可以参考 今年pip的ssh漏洞事件
如果你已经使用conda或conda env了,那建议有二进制的包都用conda装,可以保证编译器和lib的兼容性。尽量不要混用,很容易出现兼容性问题。
关于这个问题, 实际上对于每个人的最优解都是不一样的.
如果你的代码只涉及你自己, 并且你只会在某一台机器上开发, 那么选择conda没问题, 事实上它确实对于数据科学领域的包做了很多神秘加成, 并且自己用吗, 怎么方便怎么来.
如果你在多台机器上做开发, 需要和别人项目合作, 需要使用git管理代码, 甚至需要持续集成, 我强烈建议只使用pip, 或者pip这一套的东西, 至少分发到用户手上的时候要是requirements.txt
我个人只用miniconda/anaconda/conda 安装一些非开发的包, 包括python的包, 比如neovim(neovim的插件需要), 事实上这个只需要一个任意的python环境就行, 只是我习惯了使用自己安装的anaconda环境了. 或者其他的二进制开发工具或者非python的东西, 比如ruby(用于安装linuxbrew), 在这里只是把它当做了系统级的包管理工具而已, 和python没啥关系.
其他的用python写的工具, 我都在用pipx来安装, 以免破坏依赖环境.
其他的开发场景, 都是直接一个项目一个虚拟环境, 使用pipenv来做依赖管理(不是很建议再使用pipenv了), 彻底没有conda什么事情了. 我一般我也尽量不使用只能使用conda安装的工具或者库, 比如spyder
我现在唯一遇到的问题就是cuda版本的问题, 我的解决办法是, conda里面装一个特定的cuda二进制, 然后把LD_LIBRARY_PATH放出来在项目虚拟环境中用(当然你可以自己编译cuda, 但是很多人没有root权限, 那么你能用的编译环境有时候是残废的).
讲到虚拟环境, 我一直都在寻找项目隔离和快速开发之间的平衡点, 或许这个不如选择pip还是conda那么来的那么吸引人, 但是总的来说, 这个不仅是是个人口味问题, 也应该有个最佳实践.
我的看法是,网络好,用的包conda(例如一些国内云厂商的sdk可能没有conda包)上都有的话,用conda.反之用pip.
用tensorflow的话,建议考虑conda。如果你不是自己编译tensorflow,pip安装的tensorflow显卡驱动,cuda,cudnn版本都要和google预编译的版本一模一样,而且linux上装显卡驱动遇上坑的事情多了去了。用conda的话,你可以直接官网装最新驱动,conda会装他们编译好的版本。还有目前pip版本的tensorflow用的cuda版本是9.0,驱动只能用390,conda官方源是9.2,驱动用最新的410也可以,速度上会快不少。
建议用conda,安装一个miniconda就行了,用清华或者中科大源, 尽量不要在Ubuntu自带的Python里面搭环境,容易搞坏系统, 即使不用conda也要在虚拟环境里搭建
在Ubuntu下面当然要用pip来管理python的包,另外,建议用vitualenv/vitualenvwrapper来建立虚拟环境。
现在最流行的是用docker来管理python的开发环境
Windows环境木使用过,说不出所以然来,不好意思
这个具体选择的时候还是要考虑到你自身的需求
pip install可选的包相对要丰富的多
conda install对你来说更加熟悉,如果可选的包完全符合你得需求,你又比较熟悉的话,也未尝不是一种很好的选择
之前有回答提到虚拟环境,我也建议有这个需求的话可以尝试
我没有用过linux下的conda,但是说实话比较讨厌windows下的conda install。以前我觉得conda install在保证环境包依赖性方面比pip要好,直到有一天我在python3.5下用conda install安装jupyter notebook时才发现,coonda install有一个致命缺点:它虽然能够保证已有的包的依赖性,但是不能保证完整性。
什么意思?
我发现用conda install安装的jupyter notebook始终有问题,在anaconda GUI中无法打开,即使在Prompot中用命令打开了也会显示kernel error,如下图:
点击那个Kernel error进去可以发现
ImportError: No module named 'win32api'
这是因为少了pypiwin32这个模块,而这个模块conda包管理中居然没有!而是在PyPI中,得用pip安装。
这不坑爹呢吗???
我想这个问题应该不会只在这一处出现,所以自打那以后,我只用conda 创建python环境,安装包一律用pip,目前没啥问题。
如果不信的话,可以试下复现上述的问题:
1,首先anaconda创建一个python3.5新环境:conda create --name test python=3.5
2,其次进入test环境:conda activate test
3,最后安装jupyter notebook:conda install jupyter
如果用默认源的话,最后安装的python应该是3.5.6,而jupyter notebook版本是5.6.0版本。
但是,要说但是了!!!
pip并不是完美的,它肯定也有问题!
上面只是说了conda会丢失掉pypiwin32这个包,但是我还是相信它在依赖上做得没问题,这就意味着与python 3.5.6兼容的jupyter notebook应该是5.6.0版本,但是如果使用pip安装,jupyter notebook版本却是6.0.1版本。
我没有查6.0.1版本是不是也兼容python3.5.6反正能用,但是conda没有用更高的版本肯定是包的依赖项中有某些原因导致不能用更高版本,但是pip就没有管这些了,说明pip在包依赖管理上确实不如conda。
Anyway,以上都是我的脑补。能用才是王道
主要是TensorFlow的话用conda会好很多,配置tensorflow-gpu,CUDA,cuDNN等只要一行命令。
对Linux老手差别不大,venv就能解决环境管理问题,cpython3.7已经内置了。anaconda编译内置了绝大多数科学计算包,同步更新python主版本,适合所有用户。Linux系统的python版本都比较老,要用最新的feature,很多时候要用户手动编译,有很多奇奇怪怪的问题要解决,比如openssl版本过低,ssl库会编译出错。然而sbc上的arm 系统没有可用anaconda版本,只能自己编译搞定了。Linux编译是最烦的,发行版本过多,开发者一般只对一个环境测试,经常冒出些奇奇怪怪的依赖问题。可选择的话我会选anaconda,版本更新基本是同步的,python3的进化很快,每个版本都有些有趣的新feature。
用conda安装时有时候会自动把其它相关包也给安装了,但是我并不需要,有时还会显得很混乱(本人比较菜)。而pip安装就没有这个问题。另外,conda下也可以用pip,照样只会安装在所处环境下。
又因为我安装virtualenv时遇到了麻烦,所以就采取了conda建环境,pip安装包的方法,迁移也挺方便(移动硬盘把环境目录一拷直接带走)目前还没有遇到什么大问题。
目前也是在ubuntu环境下使用tensorflow,觉得pip还是蛮方便的
pipenv install
顺便,anaconda似乎对tf有神秘加成
windows下肯定是conda 这个管理起来特别方便,而且不用手动配置python路径 自带一些ide ubuntu下的话肯定是pip 简单方便 配合虚拟环境软件的使用也特别方便 ubuntu下装过conda 命令太多 后来弃用了 环境配置麻烦 容易搞崩系统
个人觉得各个平台其实都推荐pip install的。