Python imports - ModuleNotFoundError: No module named X

Python imports - ModuleNotFoundError: No module named X

我可能已经阅读了这里所有关于导入的帖子,但我仍然无法弄清楚导入是怎么回事,我花了几个小时试图让一个非常简单的例子起作用,而且真的让我抓狂.

我正在使用 python 3.7 和 pycharm 但我正在从命令行 运行 设置我的代码,对于单元测试我正在使用 pytest。

我的项目结构是:

my_message_validator/
    __init__.py

    module_1/
        __init.py__
        foo.py

    module_2/
        __init.py__
        bar.py
        baz.py

    module_3
        context.py
        test_all.py

module_1.init.py

from module_1 import foo

module_2.init.py

# For some reason pycharm doesnt complain when I use '.' but if I use module_2 it does
from . import bar, baz

如果我尝试从命令行 运行 我的代码或我的测试,无论我如何移动东西,我似乎都得到 ModuleNotFoundError: No module named,当我设法让测试工作时,我仍然无法从命令行 运行 我的代码。

如何将 module_1 导入 module_2,这些实际上是包吗?我来自 java,发现导入更容易理解,我发现 python 导入非常混乱...

另外,我怎样才能将我需要的任何东西导入到我的测试中 module\package\folders context.py

当前测试上下文如下:

import os
import sys

# Is this needed as it doesnt seem to do anything?
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

from module_1.foo import Foo

from module_2 import bar, baz

test_all.py 中,我正尝试从上下文文件中导入,如下所示:

from .context import bar,baz
from .context import Foo

# Calling in test like
Foo.load_file(file)

bar.method_one()
baz.method_two()

我需要所有 __init.py__ 文件吗?我应该在其中放入什么来制作我的方法和 类 public\exposed?我希望整个包都可以重复使用,所以希望能够像 java.

中的 jar 文件一样对待它

任何帮助将不胜感激,因为似乎每次我更改某些内容时都会在不同的地方遇到错误,python 似乎比现在的 java 复杂得多。

您是否尝试过像这样导入:

from my_message_validator.module_1.foo import Foo
from my_message_validator.module_2 import bar, baz

首先,不要使用相对导入(使用 .),因为众所周知它会导致 multiple issues。始终相对于项目的根编写导入。例如,您为 from module_1.foo import Foo 做得很好。您还应该在 test_all.pycontext.py 中执行此操作。此外,在使用相对导入后,__init__.py 文件可以留空。

很可能,Python 解释器找不到您的模块,因为 PYTHONPATH 环境变量不包含您项目的根目录。如果您在脚本之前 运行 export PYTHONPATH="YOUR_PROJECT_ROOT_ABSOLUTE_PATH:$PYTHONPATH" ,它应该按预期 运行 。为确保始终设置此变量,您可以将导出语句添加到 shell 配置文件(例如 .bashrc.bash_profile)。

跟作者聊了一下,原来还有第四期。这是一个名称冲突,就像这个 中的那个一样。在他的项目目录中,module_1实际上像它的child foo.py一样被称为foo,这让解释器感到困惑。

我有同样的情况。
我是这样启动应用程序的:

flask run

每次我在网站上遇到 ModuleNotFoundError 错误。
当我这样启动应用程序时:

python3 -m flask run

应用程序启动时没有错误:-)。