我可能已经阅读了有关进口的所有文章,但仍然无法弄清楚进口的情况,我花了数小时试图找到一个非常简单的示例,并从字面上拉了我的头发。
我正在使用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
模块_1。初始化.py
from module_1 import foo
模块_2。初始化.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复杂得多。
首先,不要使用相对导入(和.
),因为这会引起多个问题。始终相对于项目根目录编写导入文件。例如,您在方面做得很好from module_1.foo import Foo
。您还应该在test_all.py
和中执行此操作context.py
。
其次,您正在使用Python 3.7。因为Python 3.3,空 __init__.py
文件,不使用任何更多。您可以删除所有这些。
Python解释器很可能找不到您的模块,因为PYTHONPATH
环境变量不包含项目的根。如果export PYTHONPATH="YOUR_PROJECT_ROOT_ABSOLUTE_PATH:$PYTHONPATH"
在脚本之前运行,则脚本应按预期运行。为了确保始终设置此变量,您可以将export语句添加到您的shell配置文件中(例如.bashrc
或.bash_profile
)。
与作者聊天后,事实证明是第四期。就像在另一个问题中一样,这是一个名字冲突。在他的项目目录中,module_1
实际上foo
就像它的child一样被调用foo.py
,这混淆了解释器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句