我有这样的目录结构。
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 更改为其他名称,但仍然是同样的问题
我该如何解决这个问题?
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
__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
编码约定PEP8 约定。
此外,我相信您正在尝试使用您的包来完成不同的项目Chatbot
,这是正确的吗?然后,最好将
PYTHONPATH
设置为
Chatbot
并执行所有项目并单独导入。编辑:上传虚拟文件
utils
目录,我也能够无缝地处理这个项目。项目结构:
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())
同样,如果 chatbot
下有
PYTHONPATH
,您可以从设备的任何位置调用该项目。代码详细信息和文件已
添加到我的github帐户以获取详细信息。