如何借助setuptools以编程方式获取setup.py的packages列表(无需正则)
问题
给定如下setup代码:
setup( packages=['foo', 'bar'], ... )
请问是否可以借助setuptools工具,无需使用正则表达式,以编程方式获取其中的packages列表?
回答
可以实现,无需正则解析代码文本,借助setuptools及Python的函数重写机制就能做到,具体方式如下:
- 拦截setup函数调用捕获参数:这是最直接的方案,通过临时替换
setup函数,在它被调用时捕获传入的packages参数,示例代码如下:
from setuptools import setup # 用于存储捕获到的packages列表 captured_packages = None def capture_setup(**kwargs): global captured_packages # 提取packages参数 captured_packages = kwargs.get('packages') # 不执行实际的安装/打包流程 return # 替换原setup函数为自定义的捕获函数 setup = capture_setup # 导入目标setup.py文件,触发setup函数调用 import setup # 确保该脚本与你的setup.py在同一目录下 # 输出捕获到的packages print(captured_packages) # 结果为 ['foo', 'bar']
如果setup中的packages是通过find_packages()等动态方式生成的,这个方法依然有效,因为它捕获的是最终传入setup的实际参数值。
- 基于setup.cfg的配置读取:如果你的项目使用
setup.cfg文件管理配置(而非直接在setup.py中写代码),可以直接用setuptools.config.read_configuration读取配置内容:
from setuptools.config import read_configuration config = read_configuration('setup.cfg') packages = config['options'].get('packages') print(packages)
但这个方法只适用于配置存放在setup.cfg的场景。
内容的提问来源于stack exchange,提问作者Maciej C
相关产品推荐
相关产品推荐

