为什么 Python 可以识别我的导入,有时却不能?

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

我的导入行为很奇怪,具体取决于我运行 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 init modulenotfounderror
1个回答
0
投票

发生这种情况是因为导入的文件路径可能会根据执行 python 文件的程序而有所不同。在 PyCharm 中运行程序时,工作目录可能是项目的根目录。在 PowerShell 中,情况可能并非如此,因为工作目录可能是当前目录,而不是根级别项目目录。

要解决此问题,您可以使用绝对导入并从根目录指定模块的完整路径。因此,与此类似,其中

repo_name
是项目的顶级包名称:

from repo_name.actual_code.constants import CONSTANT_A, CONSTANT_B
© www.soinside.com 2019 - 2024. All rights reserved.