目录

前言

1. 问题初现

1.1 激活uv环境

1.2 模型部署

1.3 模型调用

1.4 报错

2. 原因分析

3. 解决方案

3.1 方法1:直接升级

3.2 方法2:pip安装指定版本

3.3 方法3:显式使用 PyPI 源

3.4 方法4:删除旧版本后重新装

3.5 方法5:从 GitHub 源码安装

4. 临时解决方案(未验证)

1. 在 uv 环境中使用 conda 的包路径

2. 直接复制包文件


前言

最近我在使用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/

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐