Python 连接中的ModuleNotFoundError
我有一个规范,我想用它来运行Python服务 API规范的相关部分如下:Python 连接中的ModuleNotFoundError,python,openapi,connexion,Python,Openapi,Connexion,我有一个规范,我想用它来运行Python服务 API规范的相关部分如下: paths: /find: post: summary: XXX description: XXX operationId: service.controllers.api.find requestBody: content: application/json: schema:
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()
但是,当我使用运行它时,我看到一个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'">
错误:connexion.api.abstract:无法为POST/v2/find添加操作
回溯(最近一次呼叫最后一次):
文件“/home/XXX/anaconda3/envs/find/lib/python3.6/site packages/connexion/api/abstract.py”,第206行,添加路径
self.add_操作(路径、方法)
[...]
文件“/home/XXX/anaconda3/envs/find/lib/python3.6/site packages/connexion/resolver.py”,第64行,来自操作id的解析函数
引发解析错误(消息,sys.exc_info())
connexion.exceptions.ResolverError:
在这种情况下,路径/包名称可能有问题。然而,我也尝试过从lib
目录等中调用它的许多变体,但没有成功。另外,我尝试只使用方法名,并在x-swagger-router-controller
属性中指定包,但也没有成功
我在Connexion文档中找不到关于如何正确指定operationId
的更多具体细节,因此我甚至不清楚这是否与Python模块本身、OpenAPI规范或调用Connexion的方式有关
关于从哪里开始挖掘有什么提示吗?
为什么命令行客户端找不到
服务
模块?模块相对于工作目录应该驻留在哪里?我无法重现您的问题,但我相信这是由于PYTHONPATH造成的
尝试执行:
PYTHONPATH=。connexion运行lib/service/resources/openapi/openapi.yaml
您的openapi文档(swagger.yaml?)对x-openapi-router-controller
说了什么?顺便说一句,JSON在实践中不如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'">