使用Shiv打包Python应用后遇Connexion ResolverError模块未找到问题求助
问题:Shiv打包Connexion应用后运行出现ResolverError
操作流程
- 在dist目录安装依赖:
pip install -r requirements.txt --target dist/ - 生成Python包的whl文件:
python3 setup.py bdist_wheel - 将生成的
pythonapp-1.0.0-py3-none-any.whl安装到dist目录,再用Shiv打包成pyz文件:shiv --site-packages dist -e "pythonapp.__main__:main" -o ps.pyz
运行错误
执行python ps.pyz时抛出以下错误:
raise ResolverError(msg, sys.exc_info()) connexion.exceptions.ResolverError: <ResolverError: Cannot resolve operationId "stationdetails.getstationName"! Import error was "No module named 'stationdetails'">
已尝试的无效方案
- 切换Connexion的解析器,包括
RelativeResolver、RestyResolver - 删除
__init__.py,但导致whl包无法包含所有Python文件
目录结构
test - setup.py - dist - pythonapp - __init__.py (空文件) - __main__.py - openapi.yml - stationdetails.py
相关代码
stationdetails.py
import logging def getstationName(): pass
openapi.yml
paths: /getstationName: get: tags: - pythonapp operationId: stationdetails.getstationName responses: '200': description: ok
main.py
import connexion def main(): app = connexion.App(__name__) app.add_api('openapi.yml') app.run(host="0.0.0.0",port=8000) if __name__ == "__main__": main()
setup.py
from setuptools import find_packages, setup version = '1.0.0' setup(name='pythonapp', version=version, description='pythonapp', url='', author='test', author_email='', packages=find_packages(), data_files=[('pythonapp', ['pythonapp/openapi.yml'])], include_package_data=True, zip_safe=False, )
解决方案
方案1:修正operationId为完整包路径
stationdetails是pythonapp包下的子模块,需在openapi.yml中写全模块路径:
paths: /getstationName: get: tags: - pythonapp operationId: pythonapp.stationdetails.getstationName responses: '200': description: ok
修改后重新打包运行即可解决模块找不到的问题。
方案2:显式导入模块
在__main__.py开头添加模块导入,确保Shiv打包时包含该模块:
import connexion from pythonapp import stationdetails # 显式导入子模块 def main(): app = connexion.App(__name__) app.add_api('openapi.yml') app.run(host="0.0.0.0",port=8000) if __name__ == "__main__": main()
方案3:简化Shiv打包流程
跳过手动安装whl到dist的步骤,直接打包项目:
- 先安装项目依赖:
pip install -r requirements.txt - 直接用Shiv打包整个应用:
shiv -e pythonapp.__main__:main -o ps.pyz .
这种方式会自动处理模块依赖,避免路径配置问题。
内容的提问来源于stack exchange,提问作者karljohnson
相关产品推荐
相关产品推荐

