Python 高手编程系列四十五:管理依赖

许多项目需要安装和/或使用一些外部包。如果依赖列表很长的话,就会出现一个问题:
如何管理依赖?在大多数情况下答案很简单。不要过度设计(over-engineer)问题。保持简
单,并在 setup.py 脚本中明确提供依赖列表,代码如下:
from setuptools import setup
setup(
name=‘some-package’,
install_requires=[‘falcon’, ‘requests’, ‘delorean’]

)
有些 Python 开发者喜欢使用 requirements.txt 文件来追踪包的依赖列表。在某些
情况下,你可能会找到这么做的原因,但在大多数情况下,这是项目代码没有正确打包的
时代遗留的问题。无论如何,即使像 Celery 这样著名的项目也仍然坚持使用这一约定。因
此,如果你不愿意改变习惯或者不知何故被迫使用 requirements.txt 文件,那么至少
要将其做对。下面是从 requirements.txt 文件读取依赖列表的常见做法之一:
from setuptools import setup
import os
def strip_comments(l):
return l.split(‘#’, 1)[0].strip()
def reqs(*f):
return list(filter(None, [strip_comments(l) for l in open(
os.path.join(os.getcwd(), *f)).readlines()]))
setup(
name=‘some-package’,
install_requires=reqs(‘requirements.txt’)

)
自定义 setup 命令
利用 distutils 可以创建新的命令。新的命令可以用一个入口点(entry point)来注
册,这是由 setuptools 引入的,是一种将包定义为插件的简单方法。
入口点是类或函数的命名链接,通过 setuptools 中的一些 API 变得可用。任何应用
都可以扫描所有已注册的包,并且将链接代码作为插件使用。
要想链接新的命令,可以在 setup 调用中使用 entry_points 元数据,代码如下:
setup(
name=“my.command”,
entry_points=“”"
[distutils.commands]
my_command = my.command.module.Class
“”"
)
所有命名链接都集中在已命名的部分(named section)。distutils 被加载时,它将
扫描在 distutils.commands 中注册的链接。
许多提供可扩展性的 Python 应用都使用了这一机制。
在开发期间使用包
使用 setuptools 主要是用于构建并分发包。但是,你仍然需要知道如何使用它们直
接从项目源代码安装包。其原因很简单。在向 PyPI 提交包之前,最好测试一下你的打包代
码是否正常工作。最简单的测试方法就是安装它。如果你将坏的软件包发送到仓库中,那
么你需要增加版本号才能重新上传。
在最终发行版之前测试你的代码是否被正确打包,可以避免不必要的版本号增加,当
然也可以节省时间。此外,在同时处理多个相关的包时,使用 setuptools 直接从自己的
源代码安装可能也是必要的。
setup.py install
install 命令可以将包安装到 Python 环境中。如果之前没有构建过的话,它会尝试
构建包,然后将结果注入到 Python 树中。如果提供了源代码发行版,那么可以在临时文件
夹中将其解压,然后用这个命令安装。install 命令还将安装在 install_requires 元
数据中定义的依赖。这是通过查看 Python 包索引上的包来完成的。
安装一个包时,对 setup.py 脚本的一个替代方法是使用 pip。它是 PyPA 推荐的工
具,因此即使在本地环境为了开发而安装时也应该使用它。要想从本地源代码中安装一个
包,你可以运行下面这个命令:
pip install
卸载包
令人惊讶的是,setuptools 和 distutils 都没有 uninstall(卸载)命令。幸
运的是,使用 pip 可以卸载任何 Python 包:
pip uninstall
在系统级的包上尝试卸载操作可能很危险。这也是为什么使用虚拟环境进行开发很重
要的另一个原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值