Python Wheel包构建后无法读取生成的index.html文件求助
问题分析与解决步骤
核心问题
你的setup.py中package_data使用了绝对路径,导致Wheel构建时文件被复制到错误位置,运行时无法找到文件;同时代码中访问文件的方式也未匹配正确的包内路径。
具体修正步骤
1. 调整setup.py的资源配置
绝对路径会破坏Wheel的跨环境兼容性,必须改用相对于包目录的相对路径,分两种场景处理:
场景1:将docs目录移入包内
先调整文件结构,把docs放到内层my_package包目录下(带__init__.py的那个文件夹):
. ├── my_package │ ├── my_package │ │ ├── handlers │ │ | ├── docs.py │ │ ├── __init__.py │ │ ├── main.py │ │ ├── docs # 移至内层包目录 │ │ | ├── index.html │ ├── README.md │ ├── setup.py | ├── Dockerfile | ├── Makefile
然后修改setup.py:
setup( package_data={ # 使用相对于my_package包的相对路径 'my_package': ['docs/index.html'], }, entry_points={ 'console_scripts': ( 'my_package=my_package.main:main', ), }, )
场景2:保留docs在原位置
若不想移动docs目录,改用data_files替代package_data:
setup( data_files=[ ('my_package/docs', ['my_package/docs/index.html']), ], entry_points={ 'console_scripts': ( 'my_package=my_package.main:main', ), }, )
2. 修正Dockerfile的文档构建路径
确保make build_docs生成的index.html路径与上述配置匹配:
FROM ... ADD . /vol/app WORKDIR /vol/app # 对应场景1:创建内层包的docs目录 RUN mkdir -p /vol/app/my_package/my_package/docs RUN make build_docs # 确保此命令将index.html生成到/my_package/my_package/docs下 RUN pip install .
3. 修正代码中文件访问方式
对应场景1(包内资源)
使用Python 3.7+内置的importlib.resources模块(更安全现代):
from importlib.resources import read_binary class DocsHandler(Handler): ... def get(self): data = read_binary('my_package', 'docs/index.html') self.write(data)
对应场景2(全局数据文件)
通过系统安装路径定位文件:
import os import sys class DocsHandler(Handler): ... def get(self): doc_path = os.path.join(sys.prefix, 'my_package/docs/index.html') with open(doc_path, 'rb') as f: data = f.read() self.write(data)
4. 验证构建结果
重新构建后,检查Jenkins日志,正常情况下会看到文件被复制到正确路径,比如场景1的日志应为:
copying my_package/docs/index.html -> my_package-1.99999/my_package/docs
内容的提问来源于stack exchange,提问作者AsYouWereAPx
相关产品推荐
相关产品推荐

