![](/img/trans.png)
[英]ValueError: attempted relative import beyond top-level package python
[英]Python error: attempted relative import beyond top-level package
我有一个文件: lib/deep_restore.py
有:
from ..utils.model_loader import load_masking_model, load_reconstruction_model
在utils/model_loader.py
中,我有:
import glob
import importlib
import json
import sys
import torch
import os.path as path
def load_masking_model(wandb_id, device, make_4d=False):
wandb_dir = list(glob.iglob(
path.join('wandb', '*' + wandb_id), recursive=False))[0]
model_path = path.join(wandb_dir, 'best-model.pt')
(head, tail) = path.split(model_path)
...
从evaluate.py
,我有:
from lib.deep_restore import DeepRestore
但我收到错误: ValueError: attempted relative import beyond top-level package
我究竟做错了什么?
这里的问题是 Python 没有将您的“utils”和“lib”包视为另一个更大的 package 的一部分。 相反,据 Python 所知,有一个名为“utils”的 package 和另一个名为“lib” - 以及相对导入 - 即在模块名称前加上“.” 这样 Python 从 package 内的当前文件夹中搜索,只能在同一个 package 内工作。
将其更改为绝对导入很容易 - 只需删除“。”:
from utils.model_loader import load_masking_model, load_reconstruction_model
你的代码将“工作”。 如果它是一个好的设计? 不!
正确的做法是有一个父 package 包含您正在做的所有事情,即在“lib”和“utils”目录之上,以便将两个目录视为子包。
假设您将其称为“myproject”-然后您有“myproject.lib”和“myproject.utils”-您可以通过完全指定这些名称来导入,或者从“utils”子包中执行..lib.deep_restore
.
为此,您只需要:将一个空的__init__.py
文件添加到“myproject”目录,然后从超级目录(即包含my_project
目录的目录)开始工作,或者将my_project
正确安装为“可编辑包” - 为此您需要一个最小的“setup.py”文件,在该父目录中,然后运行pip install -e.
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.