含__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
相关产品推荐
相关产品推荐

