python 包:无法从工作目录导入 class

python package: can't import a class from working directory

在我当前的工作目录中有一个子目录cpuimlearn,具有以下结构:

$ tree cpuimlearn
cpuimlearn
├── AdaBoostM1.py
├── DECOC.py
├── DOAO.py
├── factory.py
├── FocalBoost.py
├── ImECOC.py
├── __init__.py
└── SAMME.py

0 directories, 8 files

文件 factory.py 实现了 class FAC 这样:

class FAC:

    def __init__(self):

        pass
    ...

所以所有其他文件都导入这个 class。例如,AdaBoostM1.py 像这样导入 class:

File: AdaBoostM1.py

from factory import FAC
fac = FAC()
....

然而奇怪的是,这些文件无法导入 class。例如:

$ python
Python 3.8.3 (default, Jul  2 2020, 16:21:59) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 
>>> from cpuimlearn import AdaBoostM1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "~/gpuimlearn/src/CPU-imLearn/cpuimlearn/AdaBoostM1.py", line 21, in <module>
    from factory import FAC
ModuleNotFoundError: No module named 'factory'
>>> 

从创建的新 __pycache__ 目录可以看出,如果模块已成功导入,factory.cpython-38.pyc 并没有像我们预期的那样创建。

这很奇怪,因为 factory.py 在目录中可用,并且它实现了 FAC class.

$ tree cpuimlearn
cpuimlearn
├── AdaBoostM1.py
├── DECOC.py
├── DOAO.py
├── factory.py
├── FocalBoost.py
├── ImECOC.py
├── __init__.py
├── __pycache__
│   ├── AdaBoostM1.cpython-38.pyc
│   └── __init__.cpython-38.pyc
└── SAMME.py

1 directory, 10 files

factory 不是包。

您需要使用相对导入:

from .factory import FAC

或者: from cpuimlearn.factory import FAC

由于您的目录中有 __init__.py,因此该目录被视为 python 包。 要在 python 包内导入,您需要使用相对导入

from .factory import FAC

或全名导入

from cpuimlearn.factory import FAC

来自 python 文档的解释在这里:https://docs.python.org/3/tutorial/modules.html