我的导入行为很奇怪,具体取决于我运行 Python 的位置。
我有一个具有以下结构的项目:
repo-name
|_ .github
|_ actual_code
|_ __init__.py
|_ main.py
|_ constants.py
|_ Dockerfile
|_ virtual_environment
|_ other stuff
在
main.py
内,我有导入声明:
from actual_code.constants import CONSTANT_A, CONSTANT_B
当我在 IDE 控制台中运行代码时(我使用 PyCharm,社区版),它可以工作,但是如果我尝试通过
python actual_code/main.py
在 PowerShell 控制台中运行它,它会给我 ModuleNotFoundError (就好像 __init__.py
是失踪);
如果我将导入语句更改为
from constants import CONSTANT_A, CONSTANT_B
然后它在 IDE 的控制台中停止工作,但在 PowerShell 控制台中可以正常工作
我想知道: A)为什么会发生这种情况以及 B) 我能做些什么呢?根据我运行代码的位置来回更改感觉很愚蠢
我希望无论是在 IDE 还是在 PowerShell 控制台中运行,相同的代码都能以相同的方式工作,但我需要根据运行位置来更改导入。两种情况下的工作目录相同,即“repo-name”
发生这种情况是因为导入的文件路径可能会根据执行 python 文件的程序而有所不同。在 PyCharm 中运行程序时,工作目录可能是项目的根目录。在 PowerShell 中,情况可能并非如此,因为工作目录可能是当前目录,而不是根级别项目目录。
要解决此问题,您可以使用绝对导入并从根目录指定模块的完整路径。因此,与此类似,其中
repo_name
是项目的顶级包名称:
from repo_name.actual_code.constants import CONSTANT_A, CONSTANT_B