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

使用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的步骤,直接打包项目:

  1. 先安装项目依赖:
    pip install -r requirements.txt
    
  2. 直接用Shiv打包整个应用:
    shiv -e pythonapp.__main__:main -o ps.pyz .
    

这种方式会自动处理模块依赖,避免路径配置问题。

内容的提问来源于stack exchange,提问作者karljohnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 00:26:25