Python拒绝导入模块

问题描述

有三个模块,分为两个模块:

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.pytest.py导入并运行该过程。