如何在Python构建时自动执行脚本修改包?解决setup.py模块导入问题
问题解答
1. 出现ModuleNotFoundError是否正常?
这是正常现象。原因在于Python执行setup.py时,默认的sys.path并未自动包含项目根目录,而generate_source模块(注意你拼写写成了genreate_source,这也可能是报错的关键原因之一)位于项目根目录下,Python无法定位到该模块路径,因此抛出找不到模块的错误。
2. 能否从setup.py中调用该脚本?
完全可以,以下是两种可靠的实现方式:
方式一:添加路径后导入模块调用函数
先将项目根目录加入Python的搜索路径,再导入模块执行生成逻辑:
import sys from pathlib import Path from setuptools import setup # 获取setup.py所在的项目根目录 project_root = Path(__file__).resolve().parent # 将项目根目录加入sys.path,让Python能找到generate_source模块 sys.path.insert(0, str(project_root)) # 导入生成模块(注意修正拼写错误:genreate_source → generate_source) from generate_source.generate_source import your_generate_function # 先执行源码生成逻辑 your_generate_function() # 再执行打包逻辑 setup( # 你的setup配置项 )
方式二:通过subprocess直接执行脚本
如果不想处理模块导入的路径问题,可以直接用subprocess调用脚本文件:
import sys import subprocess from pathlib import Path from setuptools import setup project_root = Path(__file__).resolve().parent # 调用generate_source.py脚本 subprocess.run( [sys.executable, str(project_root / "generate_source" / "generate_source.py")], check=True, # 如果脚本执行失败则终止打包 cwd=str(project_root) ) # 执行打包逻辑 setup( # 你的setup配置项 )
额外注意事项
- 务必修正模块目录的拼写错误:
genreate_source→generate_source,拼写错误会直接导致模块无法被找到。 - 如果生成脚本依赖第三方库(如
requests等),需要在pyproject.toml的[build-system]部分添加这些依赖,确保打包过程中能正常执行生成逻辑:[build-system] requires = ["setuptools", "wheel", "requests"] # 添加生成脚本所需的依赖 build-backend = "setuptools.build_meta"
内容的提问来源于stack exchange,提问作者Pierrick Rambaud
相关产品推荐
相关产品推荐

