问题描述
有三个模块,分为两个模块:
Tools
BasicLogger.py
CascadingDataSet.py
SandBox
test.py
BasicLogger.py包含一个类(“ BasicLogger”),除“对象”外没有其他父类。
CascadingDataSet.py包含一个类(“ CascadingDataSet”),该类是BasicLogger的子类。
test.py导入CascadingDataSet如下:
import Tools.CascadingDataSet.CascadingDataSet as CascadingDataSet
(作为一个旁注,我坚信我做错了,但它不仅通常可以正常工作,而且我似乎找不到一种无需重复 somewhere 。而且,它似乎在这里工作。)
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",in <module>
import Tools.BasicLogger.BasicLogger as BasicLogger
ModuleNotFoundError: No module named 'Tools.BasicLogger.BasicLogger'; 'Tools.BasicLogger' is not a package
我尝试过:
- 为BasicLogger重命名类和文件名。没有成功。
- 重新包装包装本身。没有成功。
- 将BasicLogger.py移至其他软件包。没有成功。
- 实例化BasicLogger.py中的BasicLogger类的对象。这是成功的,但只会让我感到困惑,因为显然代码本身很好。
- 使用不同的名称创建一个全新的文件,将BasicLogger.py的内容复制到其中,然后尝试导入该文件。
- 将BasicLogger直接导入test.py。不。
- 关闭并重新打开IDE。不得不尝试。
我的IDE(用于eclipse的pyDev)完全将文件识别为适当的导入;我什至删除了导入行并进行了重新设置,让pyDev自动完成每个部分。正如我所提到的,代码可以很好地复制-但显然它在代码中有所体现。要么,要么我根本根本不了解导入,但是我已经使用python玩了一年,但这从未出现。
解决方法
我已经开始工作了。有两种方式:
两种解决方案:
此人是deceze在评论中发布的。
from Tools.BasicLogger import BasicLogger
这是双重有益的,因为它不仅解决了这个问题,而且避免了荒唐的三足动物,并且比:
import Tools.Logging as Logging
class CascadingDataSet(Logging.BasicLogger):
我仍然对为什么它适用于CascadingDataSet而不是BasicLogger感到困惑,但是我只是放开了它。
,我认为您将需要在这两个软件包之外的另一个文件,并在这两个软件包内创建一个__init__.py
文件。
main.py
Tools
BasicLogger.py
CascadingDataSet.py
Sandbox
test.py
然后可以从test.py
导入它,就像写的一样。但是您无法直接从test.py
包运行Sandbox
文件,因为它找不到Tools
包。因此,您需要runner.py
从test.py
导入并运行该过程。