You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:12:47