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
我试过:
- 重命名 BasicLogger 的 class 和文件名。没有成功。
- 正在重命名包本身。没有成功。
- 移动 BasicLogger.py 到另一个包。没有成功。
- 在 BasicLogger.py 中实例化 BasicLogger class 的一个对象。这是成功的,但只会让我更加困惑,因为显然代码本身没有问题。
- 正在创建一个具有不同名称的全新文件,将 BasicLogger.py 的内容复制到其中,然后尝试导入它。
- 将 BasicLogger 直接导入 test.py。没有。
- 关闭并重新打开 IDE。不得不尝试。
我的 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 感到困惑,但我将放手。
有问题的三个模块,在两个包中:
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
我试过:
- 重命名 BasicLogger 的 class 和文件名。没有成功。
- 正在重命名包本身。没有成功。
- 移动 BasicLogger.py 到另一个包。没有成功。
- 在 BasicLogger.py 中实例化 BasicLogger class 的一个对象。这是成功的,但只会让我更加困惑,因为显然代码本身没有问题。
- 正在创建一个具有不同名称的全新文件,将 BasicLogger.py 的内容复制到其中,然后尝试导入它。
- 将 BasicLogger 直接导入 test.py。没有。
- 关闭并重新打开 IDE。不得不尝试。
我的 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 感到困惑,但我将放手。