为什么 Pycharm 不能运行具有相对导入的代码?

Mr_*_*s_D 2 python python-import pycharm python-3.x relative-import

我的包结构:

root_pkg
root_pkg/__init__.py # empty
root_pkg/game
root_pkg/game/__init__.py # empty
root_pkg/game/game1.py
root_pkg/utils
root_pkg/utils/__init__.py # empty
root_pkg/utils/lib.py
Run Code Online (Sandbox Code Playgroud)

root_pkg/game/game1.py 包含:

"""File root_pkg/game/game1.py"""

from ..utils import lib
Run Code Online (Sandbox Code Playgroud)

不会发出任何错误

然而,在 pycharm 中运行它:

C:\_\Python363-64\python.exe C:/Dropbox/eclipse_workspaces/python/test_imports/root_pkg/game/game1.py
Traceback (most recent call last):
  File "C:/Dropbox/eclipse_workspaces/python/test_imports/root_pkg/game/game1.py", line 3, in <module>
    from ..utils import lib
ValueError: attempted relative import beyond top-level package

Process finished with exit code 1
Run Code Online (Sandbox Code Playgroud)

但是,内容和源路径被添加到运行配置中的 python 路径:

在此处输入图片说明

那么为什么 Pycharm 不能运行这个呢?它不应该将项目文件夹添加到 PYTHONPATH 吗?使用正确的导入样式吗?

编辑:更改运行配置中的工作目录会C:\Dropbox\eclipse_workspaces\python\test_imports\导致相同的错误:

C:\_\Python363-64\python.exe C:/Dropbox/eclipse_workspaces/python/test_imports/root_pkg/game/game1.py
Traceback (most recent call last):
  File "C:/Dropbox/eclipse_workspaces/python/test_imports/root_pkg/game/game1.py", line 3, in <module>
    from ..utils import lib
ValueError: attempted relative import beyond top-level package
Run Code Online (Sandbox Code Playgroud)

请注意,它使用-m开关从命令行运行良好,因此 PyCharm 没有出错是正确的:

C:\Dropbox\eclipse_workspaces\python\test_imports>C:\_\Python363-64\python.exe -m root_pkg.game.game1
Run Code Online (Sandbox Code Playgroud)

将此更改为绝对导入from utils import lib会在 pycharm 中显示错误,并且在命令行中也会失败:

C:\Dropbox\eclipse_workspaces\python\test_imports>C:\_\Python363-64\python.exe root_pkg/game/game1.py
Traceback (most recent call last):
  File "root_pkg/game/game1.py", line 3, in <module>
    from utils import lib
ModuleNotFoundError: No module named 'utils'

C:\Dropbox\eclipse_workspaces\python\test_imports>C:\_\Python363-64\python.exe -m root_pkg.game.game1
Traceback (most recent call last):
  File "C:\_\Python363-64\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\_\Python363-64\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Dropbox\eclipse_workspaces\python\test_imports\root_pkg\game\game1.py", line 3, in <module>
    from utils import lib
ModuleNotFoundError: No module named 'utils'
Run Code Online (Sandbox Code Playgroud)

Mr_*_*s_D 6

添加root_pkg到源文件夹使运行配置工作(并且 PyCharm 在绝对导入时不会出错)。

在此处输入图片说明

打印 sys.path 表明 PyCharm 将绝对路径添加到root_pkg那里,而它没有添加内容根目录的子文件夹。让我感到困惑的是,它解决了相对导入的权利,而它却在绝对导入上出错,而​​两者都无法在运行时解决。