为什么 Pycharm 不能 运行 使用相对导入编码?
Why Pycharm can't run code with relative imports?
我的包结构:
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
root_pkg/game/game1.py
包含:
"""File root_pkg/game/game1.py"""
from ..utils import lib
不会发出任何错误
运行 这在 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
然而,内容和源路径被添加到 运行 配置中的 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
请注意,使用 -m
开关在命令行中 运行 没问题,因此 PyCharm 是正确的,不会出错:
C:\Dropbox\eclipse_workspaces\python\test_imports>C:\_\Python363-64\python.exe -m root_pkg.game.game1
将此更改为绝对导入 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'
将 root_pkg
添加到源文件夹使 运行 配置工作(并且 PyCharm 在绝对导入时不会出错)。
打印 sys.path 表明 PyCharm 添加了到 root_pkg
的绝对路径,但它没有添加内容根目录的子文件夹。令我困惑的是它解决了相对进口权而它在绝对进口权上出错,而两者都无法在运行时解决。
我的包结构:
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
root_pkg/game/game1.py
包含:
"""File root_pkg/game/game1.py"""
from ..utils import lib
不会发出任何错误
运行 这在 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
然而,内容和源路径被添加到 运行 配置中的 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
请注意,使用 -m
开关在命令行中 运行 没问题,因此 PyCharm 是正确的,不会出错:
C:\Dropbox\eclipse_workspaces\python\test_imports>C:\_\Python363-64\python.exe -m root_pkg.game.game1
将此更改为绝对导入 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'
将 root_pkg
添加到源文件夹使 运行 配置工作(并且 PyCharm 在绝对导入时不会出错)。
打印 sys.path 表明 PyCharm 添加了到 root_pkg
的绝对路径,但它没有添加内容根目录的子文件夹。令我困惑的是它解决了相对进口权而它在绝对进口权上出错,而两者都无法在运行时解决。