Python 包管理全解析
在 Python 开发中,包管理是一项至关重要的技能。它涉及到如何将自己的代码打包、发布,以及如何管理项目中的依赖。下面我们将详细介绍 Python 包管理的几个重要方面。
1. 入口点(Entry Points)
入口点是一个相对复杂但又很重要的概念。从高层次来看,你可以使用入口点将脚本作为命令行工具安装到用户的路径中。要实现这一点,只需遵循特定的语法并定义一个运行命令行工具的函数。
2. 在 Python 包索引(PyPI)上注册包
如果你编写了一个很酷的工具或有用的模块,自然希望与他人分享,而将包上传到 Python 包索引是一个相对简单的过程。
2.1 注意事项
-
ReST 格式描述
:在
long_description中要包含 ReST(reStructuredText)格式的描述。因为当包上传到 PyPI 时,ReST 格式的文本会被转换为 HTML 显示。可以使用 Aaron Hillegass 创建的 ReSTless 工具来预览格式化后的文本,确保格式正确。如果 ReST 格式不正确,上传的文档将以纯文本形式显示,而不是 HTML。 -
下载链接
:提供
download_url值,它告诉easy_install在哪里搜索你的包。你可以提供一个页面链接,easy_install会自动找到包或 egg,也可以直接提供你创建的 egg 的链接。
2.2 示例
setup.py
文件
以下是一个用于上传到 Python 包索引的示例
setup.py
文件:
#!/usr/bin/env python
# liten 0.1.4.2 -- deduplication command-line tool
#
# Author: Noah Gift
try:
from setuptools import setup, find_packages
except ImportError:
from ez_setup import use_setuptools
use_setuptools()
from setuptools import setup, find_packages
import os,sys
version = '0.1.4.2'
f = open(os.path.join(os.path.dirname(__file__), 'docs', 'index.txt'))
long_description = f.read().strip()
f.close()
setup(
name='liten',
version='0.1.4.2',
description='a de-duplication command line tool',
long_description=long_description,
classifiers=[
'Development Status :: 4 - Beta',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
],
author='Noah Gift',
author_email='noah.gift@gmail.com',
url='http://pypi.python.org/pypi/liten',
download_url="http://code.google.com/p/liten/downloads/list",
license='MIT',
py_modules=['virtualenv'],
zip_safe=False,
py_modules=['liten'],
entry_points="""
[console_scripts]
liten = liten:main
""",
)
2.3 注册包
使用上述
setup.py
文件,通过以下命令可以自动在 Python 包索引上注册包:
$ python setup.py register
执行该命令后,会有一系列操作,如写入 egg 信息、清单文件等,最后服务器响应
200: OK
表示注册成功。
3. 更多学习资源
以下是一些关于 Python 包管理的重要学习资源:
| 资源名称 | 链接 |
| — | — |
| Easy install | http://peak.telecommunity.com/DevCenter/EasyInstall |
| Python eggs | http://peak.telecommunity.com/DevCenter/PythonEggs |
| The setuptools module | http://peak.telecommunity.com/DevCenter/setuptools |
| The package resources module | http://peak.telecommunity.com/DevCenter/PkgResources |
| Architectural overview of pkg_resources and Python eggs in general | Architectural Overview of pkg_resources and Python Eggs in General |
| Python 邮件列表 | http://mail.python.org/pipermail/distutils-sig/ |
4. Distutils
虽然目前很多人更喜欢使用
setuptools
来创建和分发包,但了解
distutils
的工作原理仍然很重要。当使用
distutils
创建用于分发的包时,通常使用以下命令来安装包:
python setup.py install
构建用于分发的包涉及以下四个方面:
-
编写 setup 脚本
:即
setup.py
文件。
-
setup.py
文件的基本配置选项
。
-
构建源分发
。
-
创建二进制文件
:如 rpms、Solaris pkgtool、HP-UX swinstall 等。
4.1 示例操作步骤
下面通过一个简单的示例来演示
distutils
的工作流程:
1.
创建代码
:
#!/usr/bin/env python
#A simple python script we will package
#Distutils Example. Version 0.1
class DistutilsClass(object):
"""This class prints out a statement about itself."""
def __init__(self):
print "Hello, I am a distutils distributed script." \
"All I do is print this message."
if __name__ == '__main__':
DistutilsClass()
-
创建
setup.py文件 :
#Installer for distutils example script
from distutils.core import setup
setup(name="distutils_example",
version="0.1",
description="A Completely Useless Script That Prints",
author="Joe Blow",
author_email = "joe.blow@pyatl.org",
url = "http://www.pyatl.org")
-
创建源分发包
:
在与脚本、README和setup.py文件相同的目录下运行以下命令:
python setup.py sdist
执行该命令后,会生成一个源分发包,其他人只需解包并使用以下命令安装:
python setup.py install
4.2 创建二进制文件
根据不同的操作系统,可以使用以下命令创建二进制文件:
-
构建 rpm
:
python setup.py bdist_rpm
- 构建 Solaris pkgtool :
python setup.py bdist_pkgtool
- 构建 HP-UX swinstall :
python setup.py bdist_sdux
4.3 自定义安装目录
在分发包时,你可能希望自定义安装目录。可以使用以下命令指定自定义构建目录:
python setup.py build --build-base=/mnt/python_src/ascript.py
安装时,会将构建目录中的所有内容复制到安装目录。默认情况下,安装目录是执行命令的 Python 环境中的
site-packages
目录,你也可以指定自定义安装目录,如 NFS 挂载点。
5. Buildout
Buildout 是 Zope 公司的 Jim Fulton 创建的一个工具,用于管理新应用程序的“构建”。它可以处理 Python 程序或其他程序(如 Apache),主要目标是使跨平台的构建过程可重复。
5.1 使用 Buildout
Buildout 对于处理 Zope 技术的人来说比较熟悉,但在 Python 世界的其他领域还相对较少人了解。它是部署 Plone(一个企业级内容管理系统)的推荐机制,在 Buildout 出现之前,Plone 的安装非常复杂,现在变得很简单。
此外,Buildout 还可以用于管理 Python 环境,它只需要两个东西:
- 最新的
bootstrap.py
脚本,可以从 http://svn.zope.org/
checkout
/zc.buildout/trunk/bootstrap/bootstrap.py 下载。
- 一个
buildout.cfg
文件,包含要安装的“recipes”或“eggs”的名称。
以下是使用 Buildout 安装
liten
工具的步骤:
1.
下载
bootstrap.py
脚本
:
mkdir -p ~/src/buildout_demo
curl http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py > ~/src/buildout_demo/bootstrap.py
-
定义
buildout.cfg文件 :
[buildout]
parts = mypython
[mypython]
recipe = zc.recipe.egg
interpreter = mypython
eggs = liten
-
运行
bootstrap.py脚本 :
$ python bootstrap.py
运行后会创建一些目录和脚本,如
bin
、
parts
、
eggs
等。
4.
运行 Buildout
:
$ bin/buildout
运行后会安装所需的包和脚本,如
liten
工具。
通过以上步骤,你可以看到 Buildout 可以创建一个隔离的环境,并自动部署项目所需的依赖。同时,如果你修改
buildout.cfg
文件,Buildout 会根据文件内容进行相应的操作,如移除某个 egg 会导致相应的命令行工具和库被移除。
以下是使用 Buildout 管理环境的流程图:
graph LR
A[下载 bootstrap.py 脚本] --> B[定义 buildout.cfg 文件]
B --> C[运行 bootstrap.py 脚本]
C --> D[运行 Buildout 安装依赖]
D --> E[使用工具]
F[修改 buildout.cfg 文件] --> G[重新运行 Buildout 进行更新]
综上所述,Python 的包管理是一个丰富且复杂的领域,掌握好这些工具和方法,能够让你的 Python 开发更加高效和便捷。无论是将自己的代码分享给他人,还是管理项目中的依赖,都能游刃有余。后续我们将继续介绍如何使用 Buildout 进行开发以及 virtualenv 的使用。
Python 包管理全解析
6. 使用 Buildout 进行开发
在了解了如何使用 Buildout 创建和销毁受控环境后,接下来可以进一步使用 Buildout 创建一个受控的开发环境。
在开发场景中,Buildout 的使用通常很简单。开发者可能会在版本控制系统中处理一个单独的包,将项目检出到顶级的
src
目录中,然后在
src
目录内按照之前描述的方式运行 Buildout,并使用类似以下的配置文件:
[buildout]
develop = .
parts = test
[python]
recipe = zc.recipe.egg
interpreter = python
eggs = ${config:mypkgs}
[scripts]
recipe = zc.recipe.egg:scripts
eggs = ${config:mypkgs}
[test]
recipe = zc.recipe.testrunner
eggs = ${config:mypkgs}
这个配置文件定义了开发环境的各个部分,包括 Python 解释器、脚本和测试运行器等。通过这种方式,开发者可以在一个隔离的环境中进行开发和测试,确保项目的依赖和环境配置是一致的。
7. virtualenv
根据 Python 包索引页面上的文档,“virtualenv 是一个创建隔离 Python 环境的工具”。它主要解决的问题是消除包冲突。在实际开发中,不同的工具可能需要不同版本的包,如果直接在全局的
site-packages
目录中进行操作,可能会导致生产环境的 Web 应用程序因为包的升级而出现问题。另外,开发者可能没有对全局
site-packages
目录的写入权限,这时就可以使用 virtualenv 创建一个独立于系统 Python 的虚拟环境。
7.1 安装 virtualenv
安装 virtualenv 有两种常见的方法:
-
使用 easy_install 安装
:
如果你只打算在一个 Python 版本中使用 virtualenv,这种方法很合适。使用以下命令进行安装:
sudo easy_install virtualenv
-
为多版本 Python 创建多个 virtualenv 脚本
:
如果你在机器上安装了多个版本的 Python(如 Python 2.4、Python 2.5、Python 2.6 等),并且它们共享同一个主bin目录(如/usr/bin),由于同一脚本目录中一次只能安装一个 virtualenv 脚本,所以可以采用以下步骤为每个 Python 版本创建一个别名:- 下载最新版本的 virtualenv 脚本:
curl http://svn.colorstudy.com/virtualenv/trunk/virtualenv.py > virtualenv.py
2. 将脚本复制到 `/usr/local/bin` 目录:
sudo cp virtualenv.py /usr/local/bin/virtualenv.py
3. 在 Bash 或 zsh 中创建别名:
alias virtualenv-py24="/usr/bin/python2.4 /usr/local/bin/virtualenv.py"
alias virtualenv-py25="/usr/bin/python2.5 /usr/local/bin/virtualenv.py"
alias virtualenv-py26="/usr/bin/python2.6 /usr/local/bin/virtualenv.py"
7.2 创建虚拟环境
以创建 Python 2.4 的虚拟环境为例,使用相应的别名命令创建:
virtualenv-py24 myenv24
这将在当前目录下创建一个名为
myenv24
的虚拟环境。进入虚拟环境后,你可以安装和管理项目所需的包,而不会影响系统的 Python 环境。
以下是使用 virtualenv 的操作步骤总结表格:
| 步骤 | 操作 | 说明 |
| ---- | ---- | ---- |
| 安装 |
sudo easy_install virtualenv
或按步骤创建别名 | 选择适合自己环境的安装方式 |
| 创建环境 |
virtualenv-pyXX myenvXX
| XX 为 Python 版本号,myenvXX 为自定义的虚拟环境名称 |
| 进入环境 |
source myenvXX/bin/activate
| 激活虚拟环境 |
| 安装包 |
pip install package_name
| 在虚拟环境中安装所需的包 |
| 退出环境 |
deactivate
| 退出虚拟环境 |
以下是使用 virtualenv 的流程图:
graph LR
A[安装 virtualenv] --> B[创建虚拟环境]
B --> C[进入虚拟环境]
C --> D[安装项目依赖包]
D --> E[开发和测试]
E --> F[退出虚拟环境]
总结
Python 包管理涵盖了多个重要的工具和技术,包括入口点、在 PyPI 上注册包、Distutils、Buildout 和 virtualenv。每个工具都有其独特的用途和优势。入口点让我们可以方便地将脚本作为命令行工具安装;在 PyPI 上注册包使我们能够与他人分享自己的代码;Distutils 是基础的包创建和分发工具;Buildout 可以创建可重复的跨平台构建环境;virtualenv 则解决了包冲突的问题,提供了隔离的 Python 环境。
通过掌握这些工具和方法,开发者可以更加高效地管理项目的依赖,确保项目在不同环境中稳定运行。无论是初学者还是有经验的开发者,都应该深入了解这些包管理技术,以提升 Python 开发的效率和质量。
超级会员免费看

被折叠的 条评论
为什么被折叠?



