Connexion 中的 ModuleNotFoundError
ModuleNotFoundError in Connexion
我有一个 OpenAPI 3.0 specification and I want to use it with Connexion 到 运行 一个 Python 服务。
API 规范的相关部分在这里:
paths:
/find:
post:
summary: XXX
description: XXX
operationId: service.controllers.api.find
requestBody:
content:
application/json:
schema:
type: object
[...]
servers:
- url: /v2
[...]
Python 代码的结构如下:
├── lib
│ └── service
│ ├── controllers
│ │ ├── api.py
│ │ ├── __init__.py
│ ├── __init__.py
│ ├── models
│ │ └── __init__.py
│ └── resources
│ └── openapi
│ └── openapi.yaml
api.py
内容:
def find():
return "TEST"
find
函数本身按预期工作:
import service.controllers.api
service.controllers.api.find_skills()
'TEST'
在 Python 中,Connexion 加载 API 正常:
import connexion
app = connexion.FlaskApp(__name__,
specification_dir='lib/service/resources/openapi/')
app.add_api('openapi.yaml')
<connexion.apis.flask_api.FlaskApi at 0x7f2241e35b38>
app.run()
现在,我可以成功调用端点:
$ curl -X POST http://localhost:5000/v2/find
但是,当我 运行 使用 Connexion CLI 时,我看到 ModuleNotFoundError
:
$ connexion run lib/service/resources/openapi/openapi.yaml
输出:
ERROR:connexion.apis.abstract:Failed to add operation for POST /v2/find
Traceback (most recent call last):
File "/home/XXX/anaconda3/envs/find/lib/python3.6/site-packages/connexion/apis/abstract.py", line 206, in add_paths
self.add_operation(path, method)
[...]
File "/home/XXX/anaconda3/envs/find/lib/python3.6/site-packages/connexion/resolver.py", line 64, in resolve_function_from_operation_id
raise ResolverError(msg, sys.exc_info())
connexion.exceptions.ResolverError: <ResolverError: Cannot resolve operationId "service.controllers.api.find"! Import error was "No module named 'service'">
在这种情况下,paths/package 名称可能有问题。但是,我也尝试过从 lib
目录等调用它的多种变体,但没有成功。此外,我尝试仅使用方法名称并在 x-swagger-router-controller
属性 中指定包,但也没有成功。
我无法在 Connexion 文档中找到有关如何正确指定 operationId
的更多具体细节,所以我什至不清楚这是否与 Python 模块本身相关,与打开API规范,或以调用Connexion的方式。
关于从哪里开始挖掘的任何提示?
为什么命令行客户端找不到 service
模块?模块相对于工作目录应该位于何处?
我无法重现您的问题,但我相信这是由于 PYTHONPATH 造成的。
尝试执行:
PYTHONPATH=. connexion run lib/service/resources/openapi/openapi.yaml
我有一个 OpenAPI 3.0 specification and I want to use it with Connexion 到 运行 一个 Python 服务。
API 规范的相关部分在这里:
paths:
/find:
post:
summary: XXX
description: XXX
operationId: service.controllers.api.find
requestBody:
content:
application/json:
schema:
type: object
[...]
servers:
- url: /v2
[...]
Python 代码的结构如下:
├── lib
│ └── service
│ ├── controllers
│ │ ├── api.py
│ │ ├── __init__.py
│ ├── __init__.py
│ ├── models
│ │ └── __init__.py
│ └── resources
│ └── openapi
│ └── openapi.yaml
api.py
内容:
def find():
return "TEST"
find
函数本身按预期工作:
import service.controllers.api
service.controllers.api.find_skills()
'TEST'
在 Python 中,Connexion 加载 API 正常:
import connexion
app = connexion.FlaskApp(__name__,
specification_dir='lib/service/resources/openapi/')
app.add_api('openapi.yaml')
<connexion.apis.flask_api.FlaskApi at 0x7f2241e35b38>
app.run()
现在,我可以成功调用端点:
$ curl -X POST http://localhost:5000/v2/find
但是,当我 运行 使用 Connexion CLI 时,我看到 ModuleNotFoundError
:
$ connexion run lib/service/resources/openapi/openapi.yaml
输出:
ERROR:connexion.apis.abstract:Failed to add operation for POST /v2/find
Traceback (most recent call last):
File "/home/XXX/anaconda3/envs/find/lib/python3.6/site-packages/connexion/apis/abstract.py", line 206, in add_paths
self.add_operation(path, method)
[...]
File "/home/XXX/anaconda3/envs/find/lib/python3.6/site-packages/connexion/resolver.py", line 64, in resolve_function_from_operation_id
raise ResolverError(msg, sys.exc_info())
connexion.exceptions.ResolverError: <ResolverError: Cannot resolve operationId "service.controllers.api.find"! Import error was "No module named 'service'">
在这种情况下,paths/package 名称可能有问题。但是,我也尝试过从 lib
目录等调用它的多种变体,但没有成功。此外,我尝试仅使用方法名称并在 x-swagger-router-controller
属性 中指定包,但也没有成功。
我无法在 Connexion 文档中找到有关如何正确指定 operationId
的更多具体细节,所以我什至不清楚这是否与 Python 模块本身相关,与打开API规范,或以调用Connexion的方式。
关于从哪里开始挖掘的任何提示?
为什么命令行客户端找不到 service
模块?模块相对于工作目录应该位于何处?
我无法重现您的问题,但我相信这是由于 PYTHONPATH 造成的。
尝试执行:
PYTHONPATH=. connexion run lib/service/resources/openapi/openapi.yaml