为什么 python 混淆了我的模块包

Why does python confuse my packages for modules

我有一个项目,在根包中包含 3 个嵌套包

clsgen 
-__init__.py
-main.py
-parsing
    -__init__.py
    - class1.py
    - class2.py
-generator
    -__init__.py
    -some_class_files
    -...
-utils
    -__init__.py
    -some_modules
    -...

在导入和使用包时,我一直遇到很多困难(一般来说 python - 可能是 Java/Eclipse 在我看来唯一正确的事情)。最近,我可以通过使用像 from .details import Details 这样的相对导入来滑冰:从当前 package/directory 中的一个名为 details 的模块导入名为“Details”的 class。我对程序添加了一些新的(可能是破坏性的)更改,现在,上面相同的相对导入行不再有效。似乎解释器认为我的包是模块,所以我不能使用绝对导入。

例如,如果我将导入更改为:

from parsing.details import Details

我收到这个错误:

>>> %Run class_dict.py
Traceback (most recent call last):
  File "C:\Users\Ben\VsCode\python\classgenerator\parsing\class_dict.py", line 12, in <module>
    from parsing.details import Details
  File "C:\Users\Ben\AppData\Local\Programs\Thonny\lib\site-packages\thonny\backend.py", line 305, in _custom_import
    module = self._original_import(*args, **kw)
ModuleNotFoundError: No module named 'parsing'

我什至尝试根据需要覆盖内置 ,例如

__package__ = "parsing"
from parsing.details import Details

我非常有信心我的项目打包结构设置正确(如上面的第一个示例所示(但更详细))。而且我也非常有信心我理解包、模块、相对与绝对导入的概念。然而,每当我尝试使用 Python 制作多包程序时,这个问题都会困扰我。如果有人指出错误或建议我可以采取哪些措施来缓解这个持续存在的问题,我将不胜感激。

在 Java 中,导入只是语法糖(不是真的)。在 python 中,它们是实际语句,它们是根据涉及 sys.path 变量和当前工作目录的复杂规则解析的。 运行 位于包中的 python 脚本(又名模块)的正确方法是:

$ C://path//to//python//interpreter.exe -m packagename.modulename

所以在你的情况下

$ cd "C:\Users\Ben\VsCode\python\"
$ C://path//to//python//interpreter.exe -m classgenerator.parsing.class_dict

通过这种方式可以正确解析相对导入,因为“C:\Users\Ben\VsCode\python”会自动添加到 sys.path 并且 python 扫描它并找到包类生成器 and分包解析