在 Python 中导入一个本身导入另一个模块的模块时遇到问题
Trouble importing a module that itself imports another module in Python
Python版本:3.8.5
文件结构
MainDir
|
| Utils --|
| | module1.py
| | module2.py
|
| Tests --|
| test.py
module1.py
进口 module2.py
test.py
进口 module1.py
当我 运行 python Tests/test.py
我得到以下错误:
Traceback (most recent call last):
File "test.py", line 5, in <module>
import Utils.module1
File "<abspath>/MainDir/Utils/module1.py", line 16, in <module>
import module2
ModuleNotFoundError: No module named 'module2'
我试过以下方法:
1.)
2.)
$export PYTHONPATH="$PWD"
3.) 我试过将 test.py
文件放在与 Utils
目录相同的级别。
4.)
import sys
sys.path.append("../MainDir")
及其几种变体。
他们都失败了。
唯一有效的方法就是将 test.py
放入 Utils
目录,然后 运行 从那里开始。但我知道必须有一种方法让它在自己的目录中工作。
我错过了什么?
更新
选择的答案在尝试 运行 test.py
时有效,但在尝试 运行 module1.py
.
时失败
经过更多研究,运行将其与 -m
标志和包语法结合使用;就我而言:
python -m Utils.module1
希望这对 运行 遇到此问题的其他人有所帮助。
您可能想要使用相对导入。
所以也许是这样的:
# in module1.py
import .module2
相对导入意味着您不是要从 __main__
文件导入,而是要从当前文件(在您的例子中是 module1.py)导入。
编辑:
才发现自己傻。这适用于模块,而不适用于单个文件。
请使用 from . import module2
再试一次
如果您的项目结构类似于 here,您可以使用它。还建议在你的包中使用相对导入
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
Python版本:3.8.5
文件结构
MainDir
|
| Utils --|
| | module1.py
| | module2.py
|
| Tests --|
| test.py
module1.py
进口 module2.py
test.py
进口 module1.py
当我 运行 python Tests/test.py
我得到以下错误:
Traceback (most recent call last):
File "test.py", line 5, in <module>
import Utils.module1
File "<abspath>/MainDir/Utils/module1.py", line 16, in <module>
import module2
ModuleNotFoundError: No module named 'module2'
我试过以下方法:
1.)
2.)
$export PYTHONPATH="$PWD"
3.) 我试过将 test.py
文件放在与 Utils
目录相同的级别。
4.)
import sys
sys.path.append("../MainDir")
及其几种变体。
他们都失败了。
唯一有效的方法就是将 test.py
放入 Utils
目录,然后 运行 从那里开始。但我知道必须有一种方法让它在自己的目录中工作。
我错过了什么?
更新
选择的答案在尝试 运行 test.py
时有效,但在尝试 运行 module1.py
.
经过更多研究,运行将其与 -m
标志和包语法结合使用;就我而言:
python -m Utils.module1
希望这对 运行 遇到此问题的其他人有所帮助。
您可能想要使用相对导入。
所以也许是这样的:
# in module1.py
import .module2
相对导入意味着您不是要从 __main__
文件导入,而是要从当前文件(在您的例子中是 module1.py)导入。
编辑:
才发现自己傻。这适用于模块,而不适用于单个文件。
请使用 from . import module2
如果您的项目结构类似于 here,您可以使用它。还建议在你的包中使用相对导入
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))