ModuleNotFoundError: No module named ‘pyairports‘
本文记录了在UV环境中部署Qwen2.5-7B大模型时遇到的"ModuleNotFoundError: No module named 'pyairports'"错误及解决方案。
目录
前言
最近我在使用uv环境的时候碰到了“
ModuleNotFoundError: No module named 'pyairports'
”问题,我将提供我解决这个问题的方法供大家参考。
1. 问题初现
1.1 激活uv环境
conda deactivate # 退出conda环境
source .venv/bin/activate # 激活uv环境
1.2 模型部署
CUDA_VISIBLE_DEVICES=2 python3 -m vllm.entrypoints.openai.api_server --model /data3/YY_workspace/LLM/llm_weights/qwen/Qwen/Qwen2___5-7B-Instruct-AWQ --served-model-name Qwen2.5-7B-AWQ --trust-remote-code --max-model-len 5000 --host 0.0.0.0 --port 6700 --enable-auto-tool-choice --tool-call-parser hermes --tensor-parallel-size 1 --max-num-seqs 64 --gpu-memory-utilization 0.3
1.3 模型调用
curl --location --request POST 'http://172.31.249.25:6700/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'Connection: keep-alive' \
--data-raw '{
"model": "Qwen2.5-7B-AWQ",
"messages": [
{
"role": "user",
"content": "请介绍什么是人工智能。"
}
],
"top_k": 1,
"top_p": 0.75,
"max_tokens": 4096,
"temperature": 0,
"stream": false
}'
1.4 报错
INFO 10-15 17:11:39 logger.py:37] Received request cmpl-7f08628be793427282ac548f2ca4f67a-0: prompt: '<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n<|im_start|>user\n你好<|im_end|><|im_start|>assistant\n', params: SamplingParams(n=1, presence_penalty=0.0, frequency_penalty=0.0, repetition_penalty=1.0, temperature=0.7, top_p=0.75, top_k=1, min_p=0.0, seed=None, stop=[], stop_token_ids=[], include_stop_str_in_output=False, ignore_eos=False, max_tokens=100, min_tokens=0, logprobs=None, prompt_logprobs=None, skip_special_tokens=True, spaces_between_special_tokens=True, truncate_prompt_tokens=None), guided_decoding=GuidedDecodingParams(json=None, regex=None, choice=None, grammar=None, json_object=None, backend=None, whitespace_pattern=None), prompt_token_ids: [151644, 8948, 198, 2610, 525, 264, 10950, 17847, 13, 151645, 198, 151644, 872, 198, 108386, 151645, 151644, 77091, 198], lora_request: None, prompt_adapter_request: None.
INFO: 192.168.5.17:48364 - "POST /v1/completions HTTP/1.1" 500 Internal Server Error
ERROR: Exception in ASGI application
Traceback (most recent call last):
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/uvicorn/protocols/http/httptools_impl.py", line 401, in run_asgi
result = await app( # type: ignore[func-returns-value]
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__
return await self.app(scope, receive, send)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/fastapi/applications.py", line 1054, in __call__
await super().__call__(scope, receive, send)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/applications.py", line 113, in __call__
await self.middleware_stack(scope, receive, send)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/middleware/errors.py", line 187, in __call__
raise exc
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/middleware/errors.py", line 165, in __call__
await self.app(scope, receive, _send)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/middleware/cors.py", line 85, in __call__
await self.app(scope, receive, send)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
raise exc
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/routing.py", line 715, in __call__
await self.middleware_stack(scope, receive, send)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/routing.py", line 735, in app
await route.handle(scope, receive, send)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/routing.py", line 288, in handle
await self.app(scope, receive, send)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/routing.py", line 76, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
raise exc
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/starlette/routing.py", line 73, in app
response = await f(request)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/fastapi/routing.py", line 301, in app
raw_response = await run_endpoint_function(
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
return await dependant.call(**values)
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/vllm/entrypoints/openai/api_server.py", line 330, in create_completion
generator = await completion(raw_request).create_completion(
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/vllm/entrypoints/openai/serving_completion.py", line 201, in create_completion
async for i, res in result_generator:
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/vllm/utils.py", line 496, in merge_async_iterators
item = await d
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/vllm/engine/multiprocessing/client.py", line 547, in _process_request
params = await \
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/vllm/engine/async_llm_engine.py", line 528, in build_guided_decoding_logits_processor_async
processor = await get_guided_decoding_logits_processor(
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/vllm/model_executor/guided_decoding/__init__.py", line 12, in get_guided_decoding_logits_processor
from vllm.model_executor.guided_decoding.outlines_decoding import ( # noqa
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/vllm/model_executor/guided_decoding/outlines_decoding.py", line 10, in <module>
from vllm.model_executor.guided_decoding.outlines_logits_processors import (
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/vllm/model_executor/guided_decoding/outlines_logits_processors.py", line 25, in <module>
from outlines import grammars
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/outlines/__init__.py", line 5, in <module>
import outlines.types
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/outlines/types/__init__.py", line 1, in <module>
from . import airports, countries
File "/data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/outlines/types/airports.py", line 4, in <module>
from pyairports.airports import AIRPORT_LIST
ModuleNotFoundError: No module named 'pyairports'
2. 原因分析
在部署的大模型运行环境(基于 vllm + FastAPI + outlines)中,outlines 模块依赖的第三方库 pyairports 没有被正确安装。
从报错栈来看:
vllm/model_executor/guided_decoding/outlines_logits_processors.py
→ from outlines import grammars
→ outlines/types/airports.py
→ from pyairports.airports import AIRPORT_LIST
可以确定:
-
模型请求使用了 guided decoding(受控生成/结构化生成),
-
该模式会加载
outlines库, -
而
outlines的一个子模块(types.airports)依赖了pyairports, -
但运行环境中没有安装它。
但是经过确认,我发现我环境中安装了pyairports:

基于此,我切换为conda环境验证是否能够正常访问大模型进行问答,结果发现可以,然后我检查conda环境下的pyairports版本:


至此,问题明确,是pyairports版本的问题。uv 环境中安装的版本太旧,不包含 outlines 需要的模块结构。
outlines>=0.0.40x 的版本中新增了类型定义(outlines/types/airports.py),依赖 pyairports>=2.0.0 提供的接口:
from pyairports.airports import AIRPORT_LIST
但是在 pyairports==0.0.1(非常老的版本)中:
-
没有
pyairports.airports这个子模块; -
所以即使包存在,
import也会失败; -
因此触发
ModuleNotFoundError。
3. 解决方案
既然问题已经明确,那么就开始升级pyairports版本。
3.1 方法1:直接升级
uv pip install --upgrade pyairports

但是检查之后发现还是0.0.1版本。
3.2 方法2:pip安装指定版本
uv pip install pyairports==2.1.1

uv 环境中无法安装 pyairports 2.1.1,因为 uv 无法找到该版本。这可能是因为 uv 使用的索引中没有这个版本。
3.3 方法3:显式使用 PyPI 源
uv pip install --upgrade pyairports==2.1.1 --index-url https://pypi.org/simple

uv 环境中无法安装 pyairports 2.1.1,因为 uv 无法找到该版本。
默认情况下 uv 使用 PyPI,所以我去PyPI的官网查看,发现只提供了0.0.1版本。

3.4 方法4:删除旧版本后重新装
uv pip uninstall pyairports -y
uv pip install pyairports==2.1.1 --index-url https://pypi.org/simple
3.5 方法5:从 GitHub 源码安装
# 直接从 GitHub 安装最新版本
uv pip install git+https://github.com/ozeliger/pyairports.git

安装成功。

4. 临时解决方案(未验证)
如果急需解决问题,可以:
1. 在 uv 环境中使用 conda 的包路径
# 将 conda 环境中的 pyairports 包链接到 uv 环境
ln -s /data3/YY_workspace/anaconda/anaconda3/envs/dmx/lib/python3.10/site-packages/pyairports /data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/
2. 直接复制包文件
cp -r /data3/YY_workspace/anaconda/anaconda3/envs/dmx/lib/python3.10/site-packages/pyairports* /data3/YY_workspace/uv_envs/.venv/lib/python3.10/site-packages/
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)