setuptools自定义安装时导入本地包脚本的问题
解决方法
1. 修复导入路径问题
setup.py是独立运行的脚本,不属于包内模块,因此无法使用相对导入。可以通过将项目根目录添加到Python模块搜索路径,实现对CodeGen模块的绝对导入:
修改你的setup.py如下:
import sys import os from setuptools import setup, find_packages from setuptools.command.install import install # 将项目根目录加入模块搜索路径 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from CodeGen.Generate import generate # 使用绝对导入 class CustomInstall(install): def run(self): install.run(self) generate() setup( cmdclass={"install": CustomInstall}, name="MyLibrary", packages=find_packages(), )
如果你的CodeGen/__init__.py中已经通过from .Generate import generate导出了generate函数,也可以简化为from CodeGen import generate。
2. 替代方案:使用构建阶段钩子(推荐)
如果希望在构建分发包时就生成代码(而非用户安装阶段),更符合现代打包规范,可扩展setuptools的build_py命令:
import sys import os from setuptools import setup, find_packages from setuptools.command.build_py import build_py sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from CodeGen.Generate import generate class CustomBuildPy(build_py): def run(self): generate() # 先生成代码 build_py.run(self) # 再执行常规构建逻辑 setup( cmdclass={"build_py": CustomBuildPy}, name="MyLibrary", packages=find_packages(), )
这种方式的优势是生成的代码会直接包含在分发包中,用户安装时无需再次执行生成逻辑。
注意事项
- 确保
pyproject.toml的[build-system]部分包含CodeGen.Generate所需的所有依赖,示例如下:[build-system] requires = ["setuptools", "your-dependency-package"] build-backend = "setuptools.build_meta" - 如果生成的代码属于现有包(如Package1或Package2),需确保
find_packages()能正确识别,或在packages参数中显式指定。
内容的提问来源于stack exchange,提问作者Ptival
相关产品推荐
相关产品推荐

