27、Python 包管理全解析

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()
  1. 创建 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")
  1. 创建源分发包
    在与脚本、 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
  1. 定义 buildout.cfg 文件
[buildout]
parts = mypython
[mypython]
recipe = zc.recipe.egg
interpreter = mypython
eggs = liten
  1. 运行 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 版本创建一个别名:
    1. 下载最新版本的 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 开发的效率和质量。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值