在Python3中,如何将类从一个子文件夹导入另一个子文件夹?

在Python3中,如何将类从一个子文件夹导入另一个子文件夹?,python,python-3.x,import,python-import,Python,Python 3.x,Import,Python Import,因此,我有以下文件夹结构 Root/ --outlook/ ----outlook.py --test/ ----test.py outlook.py包含一个名为outlook的类 我正在尝试导入test.py文件中的Outlook类,如下所示- from .outlook import Outlook outlook = Outlook() 我正在根文件夹中以-python test/test.py 这会导致错误- Traceback (most recent call last):

因此,我有以下文件夹结构

Root/
--outlook/
----outlook.py
--test/
----test.py
outlook.py
包含一个名为
outlook
的类

我正在尝试导入
test.py
文件中的
Outlook
类,如下所示-

from .outlook import Outlook

outlook = Outlook()
我正在根文件夹中以-
python test/test.py

这会导致错误-

Traceback (most recent call last):
  File "test/test.py", line 1, in <module>
    from .outlook.outlook import Outlook
ModuleNotFoundError: No module named '__main__.outlook'; '__main__' is not a package
回溯(最近一次呼叫最后一次):
文件“test/test.py”,第1行,在
从.outlook.outlook导入outlook
ModuleNotFoundError:没有名为“\u main\u.outlook”的模块__main__;不是一个包

请帮助。

导入错误

from outlook.outlook import Outlook
根目录/
--展望/
----outlook.py
--试验/
----test.py


在您的情况下,您正在outlook文件夹中进行检查,因此您必须同时指向该文件。

只有在从父模块中加载子模块时,相对导入路径才会起作用:

from Root.test.test import some_function
如果要将两个不同子模块中的组件一起使用并作为独立脚本,我建议使用非相对导入路径:

from Root.outlook.outlook import Outlook
您需要将模块根目录放在PYTHON_PATH环境变量中包含的文件夹中

另外,不要忘记将init.py添加到所有文件夹中

some_directory/
    Root/
        __init__.py
        outlook/
            __init__.py
            outlook.py
        test/
            __init__.py
            test.py
编辑1:
根据您希望从inside test.py导入的方式,您可以面对两种不同的场景

from Root.outlook.outlook import Outlook
将要求python可以访问“Root”目录

PYTHON_PATH="...:...:/path_to_some_directory_that_contains_Root"

遗嘱要求

PYTHON_PATH="...:...:/path_to_Root"
这个。。。指示环境变量中已存在的其他路径,您应保持原样
“添加到PYTHON_路径”表示快速实现所需结果的手动方式。实际上,使用模块时应该做的是安装它,方法是使用根目录中带有distils的“setup.py”脚本和命令

python setup.py install

我曾尝试导入您提到的Outlook类,但在导入时出现了相同的错误-
python test/test.py
。错误-
ModuleNotFoundError:没有名为“outlook”的模块
Hi,如果我必须在Pythonpath中包含根目录的路径,那么这不是有点问题吗?因为对于每个新项目,我都需要在PythonPath中包含它的顶级目录?我已经激活了我的virtualenv,然后使用-
set PYTHON\u PATH='PATH to root directory'
。但它不起作用。根据您加载模块的方式,您不需要包含顶层目录或上面的目录。对于“from Root.outlook”,您希望包含包含Root而不是Root本身的文件夹。对于“从outlook导入”,您必须包含根目录。无论如何,我同意这是不方便的,我更新了我的答案与更好的实践和一些更多的解释
python setup.py install