在安装Python包的过程当中,常常涉及到distutils、setuptools、distribute、setup.py、easy_install、easy_install和pip等等。忽然对Python的包管理凌乱了,这些工具关系是什么,应该怎么去选择使用?html
下面就简单介绍下Python包管理相关的一些内容。python
distutils 是 python 标准库的一部分,这个库的目的是为开发者提供一种方便的打包方式, 同时为使用者提供方便的安装方式。咱们常用的setup.py就是基于distutils实现的,而后经过setup.py就能够进行打包或者安装了。linux
看一个简单的例子,找一个目录建立两个文件foo.py和setup.py,内容以下:程序员
1 # foo.py 2 def func(): 3 print 'hello world!'
1 # setup.py 2 from distutils.core import setup 3 setup( 4 name='foo', 5 version='1.0', 6 author='winter', 7 author_email='winter@126.com', 8 py_modules=['foo'], 9 )
而后,在该目录中运行以下命令:windows
会建立dist文件和一个foo-1.0.zip压缩文件,使用者就能够解压缩这个包,而后执行python setup.py install进行安装,而后就可使用这个foo模块了。svn
关于更过如何编写setup.py的内容,请自行参阅Python官方文档中的setupscript部分。工具
setuptools 是对 distutils 的加强,尤为是引入了包依赖管理。咱们能够经过ez_setup.py来安装setuptools。优化
至于distribute,它是setuptools的一个分支版本。分支的缘由是有一部分开发者认为 setuptools 开发太慢。但如今,distribute 又合并回了 setuptools 中,因此能够认为它们是同一个东西。ui
前面看到setup.py能够建立一个压缩包,而setuptools使用了一种新的文件格式(.egg),能够为Python包建立 egg文件。setuptools 能够识别.egg文件,并解析、安装它。url
首先,不推荐使用,由于只能安装不能卸载
当安装好setuptools/distribute以后,咱们就能够直接使用easy_install这个工具了:
1) 从PyPI上安装一个包:当使用 easy_install package 命令后,easy_install 能够自动从 PyPI 上下载相关的包,并完成安装,升级
2) 下载一个包安装:经过 easy_install package.tgz 命令能够安装一个已经下载的包
3) 安装egg文件:经过 easy_install package.egg 能够安装一个egg格式的文件
根据上面的分析,能够看到setuptools/distribute和easy_install之间的关系:
a)setuptools/distribute 都扩展了 distutils,提供了更多的功能
b)easy_install是基于setuptools/distribute的一个工具,方便了包的安装和升级
pip是目前最流行的Python包管理工具,它被看成easy_install的替代品,可是仍有大量的功能创建在setuptools之上。
easy_install 有不少不足:安装事务是非原子操做,只支持 svn,没有提供卸载命令, 安装一系列包时须要写脚本。pip 解决了以上问题,已经成为新的事实标准。
经过pip –help查看帮助文档,cmd下直接运行pip命令;
若是你对yum和apt-get比较熟悉,那么pip的命令会让你有种似曾相识的感受;
pip经常使用命令集合:
1)安装包
pip install SomePackage #从PyPI安装PyPI上最新的软件包 pip install SomePackage==1.0.4 #安装指定版本的软件包 pip install 'SomePackage>=1.0.4' #安装版本不能低于1.0.4 pip install ./downloads/SomePackage-1.0.4.tar.gz #本地安装 pip install http://my.package.repo/SomePackage-1.0.4.zip #从网上某个连接安装
还有一个根据依赖文件安装:
pip freeze > requirements.txt # 使用pip导出依赖文件列表 pip install -r requirements.txt # 根据依赖文件列表,自动安装对应的软件包
2)升级包
pip list --outdated #查看可升级软件包 pip install --upgrade SomePackage #升级软件包
3)卸载包
pip uninstall SomePackage
4)查询包
pip list #查看已安装软件包 pip show --files SomePackage #查看软件包安装了哪些文件及路径等信息 pip search “query” #不知道要安装的软件包的具体名称,使用search命令进行查询,会列出相关的包
5)配置镜像源
pip的镜像地址默认在国外,速度比较慢,能够设置为国内镜像源
a)linux
修改 ~/.pip/pip.conf (Linux/Mac)
b)windows
C:\Users\当前用户名\pip\pip.ini(没有pip.ini就建立一个)
国内的能够配置成清华的镜像源,配置为:
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple
pip install xxx --proxy=http://username:password@host:port
有时在安装python包时会提示pip版本太低:
这时须要升级pip版本,执行以下命令
pip install --upgrade pip -vvv
说到conda,就必需要说到anaconda了;
Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windows系统,拥有大量的用于科学计算的第三方库;
conda是anaconda的包管理和环境管理工具, 是 pip 和 vitualenv 的组合。强烈推荐
anaconda解决了Python开发者的两大痛点:
1)提供包管理,功能相似于 pip,Windows 平台安装第三方包常常失败的场景得以解决。
2)提供虚拟环境管理,功能相似于 virtualenv,解决了多版本Python并存问题。
安装时,会发现有两个不一样版本的Anaconda,分别对应Python 2.7和Python 3.5,两个版本其实除了这点区别外其余都同样。后面咱们会看到,安装哪一个版本并不本质,由于经过环境管理,咱们能够很方便地切换运行时的Python版本。
经过conda –help命令查看帮助
1)安装包
conda install -n python34 somepackage # -n 安装到指定环境;若是不用-n指定环境名称,则被安装在当前活跃环境;-c 指定经过某个channel安装
2)升级包
提示:pip只是一个包管理器,因此它不能为你管理环境。pip甚至不能升级python,由于它不像conda同样把python当作包来处理。可是它能够安装一些conda安装不了的包。
conda能够用来升级python,anaconda,conda,有木有感受很强大
conda update -n python34 xxx # 更新package conda update conda # 更新conda,保持conda最新 conda update anaconda # 更新anaconda conda update python # 更新python
3)删除包
conda remove -n python34 xxx
4)查询包
conda install xxxx # 安装xxxx conda list # 查看当前环境下已安装的包 conda list -n python34 # 查看某个指定环境的已安装包 conda search xxx # 查找package信息
5)修改镜像源
a)命令方式
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 添加Anaconda的TUNA镜像,TUNA的help中镜像地址加有引号,须要去掉 conda config --set show_channel_urls yes # 设置搜索时显示通道地址
b)配置文件方式
修改 ~/.condarc (Linux/Mac) 或 C:\Users\当前用户名.condarc (Windows) 配置:
channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ - defaults show_channel_urls: yes
主要用于解决多版本python共存的问题,同时针对不一样的项目建立独立的开发环境;除了conda,其余主流的还有virtualenv和pyenv,可是我仍是喜欢用conda
1)经过conda命令管理
# 建立一个名为python34的环境,指定Python版本是3.4(不用管是3.4.x,conda会为咱们自动寻找3.4.x中的最新版本),新的开发环境会被默认安装在目录~/anaconda/envs下。你能够经过-h指定一个其余的路径;若是咱们没有指定安装python的版本,conda会安装咱们最初安装conda时所装的那个版本的python。 conda create –name python34 python=3.4 # 安装好后,使用activate激活某个环境 activate python34 # for Windows source activate python34 # for Linux & Mac # 激活后,会发现terminal输入的地方多了python34的字样,实际上,此时系统作的事情就是把默认2.7环境从PATH中去除,再把3.4对应的命令加入PATH # 此时,再次输入 python--version # 能够获得`Python 3.4.5 :: Anaconda 4.1.1 (64-bit)`,即系统已经切换到了3.4的环境 # 若是想返回默认的python 2.7环境,运行 deactivate python34 # for Windows source deactivate python34 # for Linux & Mac # 复制一个环境 conda create -n pyhon34 --clone python34clone # 删除一个已有的环境 conda remove –name python34 --all # 查看已安装的环境,当前被激活的环境会显示有一个星号或者括号 conda info -e
activate和deactivate效果以下:
2)pycharm
很是简单
设置环境名字,存放的位置以及环境安装的python版本
2012年发布的跨平台包管理软件conda,是在数据分析界和Numpy和Scipy同样受欢迎的python工具。可是普通程序员平时只是会使用conda安装一些第三方包, 对它从哪里来,它是什么,和它要到哪里去所知甚少。今天咱们就要讲一下关于conda和anaconda不可不知的误解和事实——conda必知必会的那些事实。
事实: Conda是一个包管理器;Anaconda才是一个python发行版。虽然conda是用Anaconda打包的,可是它们两个的目标是彻底不一样的。
软件发行版是在系统上提早编译和配置好的软件包集合, 装好了后就能够直接用。包管理器是自动化软件安装,更新,卸载的一种工具。Conda,有命令”conda install”, “conda update”, “conda remove”, 因此很明显, conda是包管理器。
再来讲说, Anaconda 和 Miniconda. Anaconda发行版会预装不少pydata生态圈里的软件,而Miniconda是最小的conda安装环境, 一个干净的conda环境。
可是,conda和Anaconda没有必然关系, 你能够不安装Anaconda的同时, 使用conda安装和管理软件。
事实:Conda是一个通用的包管理器,当初设计来管理任何语言的包。因此用来管理python包固然也是绰绰有余。
$ conda search –canonical | grep -v ‘py\d\d’
这句命令能够帮你找出不是 pip和virtualenv能够管理的python包,而conda能够管理
事实:Conda 和 pip 目标并不相同,只有小部分子集有交集有竞争关系:好比python包的安装和环境隔离。
一句话就能够看出区别:
pip能够容许你在任何环境中安装python包,而conda容许你在conda环境中安装任何语言包(包括c语言或者python)。
若是咱们只是关注python包安装,conda和pip也是为不一样用户和不一样目标定制的。若是你想在一个已有系统快速管理python包,那你应该选择pip,由于conda应该在conda环境中使用,而pip鼓励在任何环境中使用 。而若是,你想要让许多依赖库一块儿很好地工做(好比数据分析中的Numpy,scipy,Matplotlib等等)那你就应该使用conda,conda很好地整合了包之间的互相依赖。
事实:Conda做者多年来用python标准创造conda,只有在很是清晰合理的时候,才使用其余工具。
你可能会问,我相信conda是遵循python标准的,可是它们为何恰恰要撇开pip本身去造一套包管理器呢?为何他们不直接去pip团队贡献想法呢?
事实上,一开始conda那伙人是想在pip社区贡献想法和代码的,可是像numpy,scipy这样对底层c库有复杂依赖的包管理需求,真的很少,因此社区不接受这样的不常有的需求。因此,他们只能本身去造conda包管理器了。
事实上:你能够在virtualenv环境下安装conda,可是最好用conda本身的环境工具,这样会和pip有更好的兼容性
你能够在virtualenv里面安装conda:
$ virtualenv test_conda $ source test_conda/bin/activate $ pip install conda $ conda install numpy
也能够在conda中造虚拟环境:
$ conda create -n yourenvname python=x.x anaconda
$ source activate yourenvname
事实:wheels只是解决了conda试图克服的许多困难中的一个, conda二进制编排仍是有不少wheels没有的优点
wheels和conda都解决了预编译的代码安装问题(不只仅是源代码安装)。可是wheel没有conda的依赖处理能力,wheels只能跟踪python代码的依赖关系,conda能够跟踪不少c代码的依赖关系,这为许多用numpy和scipy作科学计算优化的科学家省了很多心。
Reality: conda (the package manager and build system) is 100% open-source, and Anaconda (the distribution) is nearly there as well.
Anaconda和conda都是standard BSD license开源标准。若是你还不放心,用pip install conda吧,这是彻底开源的。
事实: 虽然conda默认渠道没有彻底开源,可是有一个社区牵头的conda-forge,它会推进conda的包和发行版彻底开源。
事实: conda没有和Continuum Analytics公司有不少牵扯;公司为社区免费提供支持服务,全部软件都有负责人,而不是公司全权负责。
事实: pip 和 conda 是为不一样目的存在的,咱们应该更加关注怎么同时用好这两个工具,而不是只用一个