ValueError:尝试相对导入超出顶级包python

问题描述 投票:0回答:2

我有这样的目录结构。

Chatbot/
   utils/
     abc.py
   projects/
      proj1/
        utils/
          __init__.py
          data_process.py
        components/
          class1.py

我的结构中有两个

utils
文件夹,一个位于顶层,一个位于我的项目文件夹中。

现在我想在

data_process.py
中导入
class1.py
文件。所以我尝试了这样

from utils.data_process import DataProcess

但它引用了顶级

utils
文件夹,甚至 VSCode 也无法识别它。我尝试在
__init__.py
文件夹中创建
utils
文件,但仍然不起作用。

我尝试使用空

__init__.py
,然后放置此内容

from . import data_process
__all__ = ['data_proces']

然后

from .data_process import DataPreprocess
__all__ = ['DataPreprocess']

然后我尝试了

from ..utils.data_process import DataProcess

VSCode 正在识别这一点,但它不起作用并抛出错误

ValueError: attempted relative import beyond top-level package

即使我尝试将名称 utils 更改为其他名称,但仍然是同样的问题

我该如何解决这个问题?

python importerror
2个回答
1
投票

sys.path
是 Python 搜索模块和包的地方,并且它按顺序执行。

所以你可以将

...../proj1/

 放在列表的开头,当 python 开始搜索时,它会首先找到该路径中的 
utils
 文件夹!

import sys sys.path.insert(0, r'...../proj1/')
但这会导致另一个问题,python总是先在该文件夹中找到

utils

,这不是你想要的。

解决方案1

绝对进口:

from Chatbot.projects.proj1.utils.data_process import DataProcess
解决方案2

使用@Mr.Hobo提到的相对导入。


1
投票
Python 模块由一个名为

__init__.py

 的特殊文件定义,该文件应该存在于所有子目录中。所以,你的文件结构将是:

Chatbot/ __init__.py utils/ __init__.py abc.py projects/ __init__.py proj1/ __init__.py utils/ __init__.py data_process.py components/ __init__.py class1.py class2.py
现在,您可以进行相对导入,例如:

    使用
  • .
     导入同一目录中的内容。示例:
# file Chatbot/projects/proj1/components/class2.py from .class1 import *

    同样,两级使用
  • ..
    ,三级使用 
    ...
    ,依此类推!
例如:

# file Chatbot/projects/proj1/components/class2.py from ..utils.data_process import * # import from data_process.py # there will be four "." earlier I made a counting mistake from ....utils.abc import * # import something from abc.py
编码约定

编写 python 模块/包时,您可能需要遵循

PEP8 约定

此外,我相信您正在尝试使用您的包来完成不同的项目

Chatbot

,这是正确的吗?然后,最好将 
PYTHONPATH
 设置为 
Chatbot
 并执行所有项目并单独导入。

编辑:上传虚拟文件

即使使用两个

utils

 目录,我也能够无缝地处理这个项目。项目结构:

enter image description here

main

 文件及其输出:

# file main.py from chatbot.utils.abc import hello as a1 from chatbot.projects.proj1.components.class1 import super_hello from chatbot.projects.proj1.utils.data_process import hello as b1 print(a1(), b1()) print(super_hello())

enter image description here

同样,如果

chatbot

 下有 
PYTHONPATH
,您可以从设备的任何位置调用该项目。

代码详细信息和文件已

添加到我的github帐户以获取详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.