繁体   English   中英

Python 错误:尝试相对导入超出顶级 package

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM