第三方包
从一开始,如果要做一些实际Python开发,你一定会用到一些第三方包。
在Linux系统上至少有3种安装第三方包的方法。
- 使用系统自带的包管理系统(deb,rpm,等)
- 通过社区开发的各种工具,例如
pip
,easy_install
等 - 从源文件安装
这三个方面,几乎完成同样的事情。即:安装依赖,编译代码(如果需要的话),将一个包含模块的包复制的标准软件包搜索位置。
第二步和第三步在所有的操作系统上基本相同。
我再次希望您可以在 Stack Overflow 上找到你的平台的第三方包安装方法。
在哪找第三方包?
在安装第三方包之前,你首先要找到他们。以下是几种方法:
- 你的系统包管理器中的发行版专用包。
- PythonPackageIndex(orPyPI)
- 大量的源代码服务器,例如Launchpad,GitHub,BitBucket等
通过发行版专用包安装
通过包管理器安装包安装包就像使用命令行或者GUI安装别的软件那样简单。
例如在Ubuntu中安装 simplejson
- $ sudo apt-get install python-simplejson
通过pip安装
easy_install渐渐不再流行。我们将主要介绍pip,它是easy_install的一个替代品。
pip是一个用来安装和管理Python包的工具,就如同Python Packet Index一样。
pip并没有随着Python一起安装,因此我们需要先安装它。Linux下,一般这样安装:
- $ sudo apt-get install python-pip
在安装任何其他包之前,我总是通过PyPI将pip升级到最新版本的,
Ubuntu软件库中的版本普遍落后的PyPI。我通过pip升级pip它自己。
- $ sudo pip install pip --upgrade
现在如果需要安装任何包,你可以运行 pip install package-name
命令。
所以可以通过下面命令安装 simplejson
:
- $ sudo pip install simplejson
删除包也很简单。
- $ sudo pip uninstall simplejson
一般情况下, pip
会从PyPI自动安装最新的稳定版,
但有时我们需要安装一个特定版本的包,因为你的项目可能基于特殊的版本。
因此你可能需要使用类似如下的 pip install
命令:
- $ sudo pip install simplejson==2.2.1
我们可能需要升级/降级/重新安装包。此时可以通过下面的命令完成:
- $ sudo pip install simplejson --upgrade # Upgrade a package to the latest version from PyPI
- $ sudo pip install simplejson==2.2.1 --upgrade # Upgrade/downgrade a package to a given version
现在,如果你想安装一个处于开发版本的包,它在版本控制仓库有,但是PyPI中还没有怎么办?pip
能够很好的处理这种情况,但在这之前,你需要自己安装这个版本控制仓库。Ubuntu下,你可以如下安装:
- $ sudo apt-get install git-core mercurial subversion
安装版本控制仓库之后,从版本控制仓库安装包就如下所示:
- $ sudo pip install git+http://hostname_or_ip/path/to/git-repo#egg=packagename
- $ sudo pip install hg+http://hostname_or_ip/path/to/hg-repo#egg=packagename
- $ sudo pip install svn+http://hostname_or_ip/path/to/svn-repo#egg=packagename
你也可以同样简单的从本地仓库安装,注意下面的三斜杠是文件目录。
- $ sudo pip install git+file:///path/to/local/repository
有一点需要注意,如果使用 git
协议安装,你需要使用 git+git
前缀:
- $ sudo pip install git+git://hostname_or_ip/path/to/git-repo#egg=packagename
现在你可能会好奇这些 egg 会被怎么使用。
现在你需要明白的是一个egg是一个被压缩的Python包,里面包含了源代码和一些元数据。pip
在安装包前建立了egg信息。你可以在代码仓库的 setup.py
文件中找到egg名字。
找到 setup
块然后找到类似于 name="something"
的字段。
它可能看起来就像如下的代码(这段代码从simplejson的 srtup.py
得到)一样。
- setup(
- name="simplejson", # <--- This is your egg name
- version=VERSION,
- description=DESCRIPTION,
- long_description=LONG_DESCRIPTION,
- classifiers=CLASSIFIERS,
- author="Bob Ippolito",
- author_email="bob@redivi.com",
- url="http://github.com/simplejson/simplejson",
- license="MIT License",
- packages=['simplejson', 'simplejson.tests'],
- platforms=['any'],
- **kw)
如果没有 setup.py
文件咋办?这样如何找到egg名?其实我们不需要。
把包源码拷贝到你的工程目录下,然后导入进去就可以直接用了。
—user 选项
上面的所有例子把包都安装到系统范围。如果你在 pip install
时使用 —user
选项,包将被安装到 ~/.local
目录下。在我的机子上,如下所示:
- $ pip install --user markdown2
- Downloading/unpacking markdown2
- Downloading markdown2-1.0.1.19.zip (130Kb): 130Kb downloaded
- Running setup.py egg_info for package markdown2
- Installing collected packages: markdown2
- Running setup.py install for markdown2
- warning: build_py: byte-compiling is disabled, skipping.
- changing mode of build/scripts-2.7/markdown2 from 664 to 775
- warning: install_lib: byte-compiling is disabled, skipping.
- changing mode of /home/mir/.local/bin/markdown2 to 775
- Successfully installed markdown2
- Cleaning up...
注意: markdown2 被安装到 /home/mir/.local/bin/markdown2
这个目录下。
有很多原因使你不想将包安装到系统目录中。
稍后我将讲解如何对于每个项目设置独立的Python环境。
从源码安装
从源码安装包仅仅需要一个命令,解压这个包到一个目录,然后执行下面的命令。
- cd /path/to/package/directory
- python setup.py install
尽管这些安装的办法并没有什么不同,但 pip
方式是最好的。pip
让你拥有轻松升级/降级包的能力,而手动安装你就不得不去手动下载,解压的安装。
手动安装包应该使你最后一个选择,如果别的全部失败了(一般不太可能)。
安装需要编译的包
我们现在已经了解了大多数包的安装方法,但有些包还没有介绍:包含C/C++代码的Python包,它们需要在安装前被编译。
关于这些包最好的例子是数据库适配器,图片处理库等。
虽然 pip
可以处理编译安装的源码,但我个人更喜欢使用发行版的包管理器提供的包。
它将会安装编译好的二进制文件。
如果你还是想用 pip
安装,下面是在Ubuntu系统上需要做的。
编译器的相关工具:
- $ sudo apt-get install build-essential
Python开发环境(头文件等):
- $ sudo aptitude install python-dev-all
如果你的系统没有 python-dev-all
,看看这些相似的名字 python-dev
, python2.X-dev
等等。
确保你已经安装了 psycopg2
(PostgreSQL RDBMS adapter for Python),你将需要PostgreSQL的开发文件。
- $ sudo aptitude install postgresql-server-dev-all
完成这些依赖的安装后,你就能运行 pip install
了。
- $ sudo pip install psycopg2
还需要注意一点: 并不是所有的包都能通过pip编译安装! 。
但如果你对编译安装很有自信,或者已经对于如何在自己的目标平台安装有足够的经验。
那就大胆的手动安装吧!