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

含__init__.py仍无法识别本地Python包的问题求助

问题描述

项目结构如下:

project/
├─ ams/
│  ├─ __init__.py
│  ├─ common/
│  │  ├─ dataclasses.py
│  │  ├─ __init__.py
├─ entry_point/
│  ├─ bar_api/
│  │  ├─ swagger/
│  │  │  ├─ main.yaml
│  │  ├─ __init__.py
│  ├─ run.py
│  ├─ __init__.py
  • run.py包含导入代码:from ams.common.dataclasses import Foo
  • 无论在项目根目录执行python entry_point/run.py,还是进入entry_point目录执行python run.py,均触发ImportError
  • 所有目录已添加__init__.py,其他开发者环境正常,仅需本地测试部署
  • 尝试将项目根目录加入PYTHONHOME或PYTHONPATH时,出现ModuleNotFoundError: No module named 'encodings',标准库路径查找错误,资料显示修改此类变量不妥
  • 【更新1】将run.py移至项目根目录执行时,出现FileNotFoundError: [Errno 2] No such file or directory: 'bar_api/swagger/main.yaml',推测代码基于entry_point目录作为工作目录读取文件

解决方案

方案1:临时指定PYTHONPATH(本地测试首选)

无需修改全局环境变量,仅在执行脚本时临时设置,避免影响系统Python环境:

  • Linux/macOS(项目根目录下执行):
    PYTHONPATH=$(pwd) python entry_point/run.py
    
  • Windows CMD(项目根目录下执行):
    set PYTHONPATH=%cd% && python entry_point\run.py
    
  • Windows PowerShell(项目根目录下执行):
    $env:PYTHONPATH = (Get-Location).Path; python entry_point\run.py
    

该方式仅在当前命令会话生效,可让Python正确识别项目根目录下的ams模块。

方案2:在run.py中添加路径处理代码

直接在run.py最顶部加入路径配置,同时修正yaml文件读取路径,彻底解决两种报错:

import os
import sys

# 配置项目根目录到Python搜索路径
project_root = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, project_root)

# 修正yaml文件读取路径(替换原读取代码)
current_script_dir = os.path.dirname(os.path.abspath(__file__))
yaml_file_path = os.path.join(current_script_dir, "bar_api", "swagger", "main.yaml")

# 后续正常导入和业务代码
from ams.common.dataclasses import Foo

# 读取yaml示例
with open(yaml_file_path, "r") as f:
    content = f.read()

这样无论从哪个目录执行run.py,既不会出现导入错误,也能正确找到yaml文件。

方案3:使用Python模块方式执行(规范做法)

在项目根目录下,将entry_point.run作为模块执行,Python会自动将项目根目录加入搜索路径:

python -m entry_point.run

注意:此方式下工作目录为项目根目录,仍需按照方案2中的方法修正yaml文件的读取路径,避免文件找不到的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:27:44