Python 拒绝导入模块

Python refuses to import a module

有问题的三个模块,在两个包中:

Tools
   BasicLogger.py
   CascadingDataSet.py

Sandbox
   test.py

BasicLogger.py 包含一个 class ('BasicLogger'),除了 'object'.

之外没有父项

CascadingDataSet.py 包含一个 class ('CascadingDataSet'),它是上面 BasicLogger 的子项。

test.py 导入 CascadingDataSet 如下:

import Tools.CascadingDataSet.CascadingDataSet as CascadingDataSet

(作为旁注,我确信我做错了,但它不仅通常有效,而且我似乎找不到不重复的方法来做到这一点某处。另外,它似乎在这里工作。)

CascadingDataSet.py 导入 BasicLogger 如下:

import Tools.BasicLogger.BasicLogger as BasicLogger

这是它失败的地方,这是我得到的错误。

Traceback (most recent call last):
  File "D:\code\python\Engine\SandBox\test.py", line 7, in <module>
    import Tools.CascadingDataSet.CascadingDataSet as CascadingDataSheet
  File "D:\code\python\Engine\Tools\CascadingDataSet.py", line 7, in <module>
    import Tools.BasicLogger.BasicLogger as BasicLogger
ModuleNotFoundError: No module named 'Tools.BasicLogger.BasicLogger'; 'Tools.BasicLogger' is not a package

我试过:

我的 IDE(eclipse 的 pyDev)完全将该文件识别为适当的导入;我什至删除了导入行并重新编辑它让 pyDev 自动完成每个部分。正如我所提到的,代码复制得很好——但它显然在代码中。要么,要么我根本不了解进口,但我一直在玩 python 大约一年,但从来没有出现过。

我认为您将需要这两个包之外的另一个文件,并在这两个包内创建一个 __init__.py 文件。

main.py

Tools
   BasicLogger.py
   CascadingDataSet.py

Sandbox
   test.py

然后从 test.py 你可以像你写的那样导入它。但是你不能直接从 Sandbox 包 运行 test.py 文件,因为它找不到 Tools 包。这就是为什么您需要 runner.py 导入和 运行 来自 test.py.

的过程

我已经开始工作了。两种方式:

两种解决方案:

这个是deceze在评论里发的

from Tools.BasicLogger import BasicLogger

这有双重帮助,因为它不仅解决了这个问题,而且避免了可笑的三连击,而且比以下内容更紧凑和优雅:

import Tools.Logging as Logging

class CascadingDataSet(Logging.BasicLogger):

我仍然对为什么它适用于 CascadingDataSet 但不适用于 BasicLogger 感到困惑,但我将放手。