如何拆分setup.py为多个模块且不影响pip安装?
解决setup.py模块化拆分且不包含buildchain到用户环境的方案
针对你遇到的问题,核心原因是pip在隔离构建环境中运行时,不会自动将项目根目录加入Python的模块搜索路径,导致无法找到buildchain模块。以下是几种可行的解决方案:
方案一:临时将项目根目录加入sys.path
直接在setup.py开头添加代码,将项目根目录加入Python的模块搜索路径,确保构建过程中能导入buildchain模块,同时保持buildchain不被打包到最终安装包中。
修改后的setup.py代码:
import sys from pathlib import Path import setuptools # 将项目根目录添加到模块搜索路径的最前面 sys.path.insert(0, str(Path(__file__).resolve().parent)) # 现在可以正常导入buildchain模块 from buildchain.extension_generator import CppExtensionGenerator setuptools.setup( # ... 原有的setup配置 ext_modules=CppExtensionGenerator().create_ext_modules() )
方案二:安全的临时路径添加(避免全局影响)
如果担心修改sys.path会产生副作用,可以使用try-finally块在导入完成后移除添加的路径:
import sys from pathlib import Path import setuptools project_root = str(Path(__file__).resolve().parent) sys.path.insert(0, project_root) try: from buildchain.extension_generator import CppExtensionGenerator finally: # 移除临时添加的路径,恢复原有的sys.path if sys.path[0] == project_root: sys.path.pop(0) setuptools.setup( # ... 原有的setup配置 ext_modules=CppExtensionGenerator().create_ext_modules() )
确保buildchain不被打包到最终安装包
为了彻底避免buildchain被包含在分发包中,需要做以下配置:
- 在项目根目录创建
MANIFEST.in文件,添加:
这会确保prune buildchain/buildchain目录被排除在源代码分发包(sdist)之外。 - 如果使用
setuptools.find_packages,由于你的业务代码在src目录下,find_packages(where="src")不会自动包含buildchain,无需额外排除。
验证方案有效性
- 在干净的虚拟环境(如tox环境)中运行
pip install .,确认安装过程无ModuleNotFoundError错误。 - 检查安装后的环境,确认
buildchain模块不存在于Python的site-packages目录中。 - 运行
pip wheel .生成wheel包,解压后确认包内没有buildchain目录。
内容的提问来源于stack exchange,提问作者Anaphory
相关产品推荐
相关产品推荐

