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.py
和 context.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
应用程序启动时没有错误:-)。
我可能已经阅读了这里所有关于导入的帖子,但我仍然无法弄清楚导入是怎么回事,我花了几个小时试图让一个非常简单的例子起作用,而且真的让我抓狂.
我正在使用 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.
任何帮助将不胜感激,因为似乎每次我更改某些内容时都会在不同的地方遇到错误,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.py
和 context.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
应用程序启动时没有错误:-)。