Python导入-ModuleNotFoundError:没有名为X的模块

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

[我可能已经阅读了这里有关进口的所有文章,但我仍然无法弄清楚进口的情况,我花了数小时试图得到一个非常简单的示例,并且确实将我的头发拔出来。

我正在使用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导入非常令人困惑...

然后我又如何将我需要的东西导入到我的测试模块\ 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__文件,并且应该在其中添加什么以使我的方法和类公开/公开?我希望整个程序包都可重用,因此希望能够将其像Java中的jar文件一样对待。

任何帮助都将不胜感激,因为每次我更改某个地方的错误时,Python似乎比Java都要复杂得多。

python python-3.x module package python-3.7
2个回答
0
投票
您是否尝试过像这样导入:

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


0
投票
首先,不要使用相对导入(与.一起使用,因为众所周知会导致multiple issues。始终将导入内容相对于项目的根目录编写。例如,您为from module_1.foo import Foo做得很好。
© www.soinside.com 2019 - 2024. All rights reserved.