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
在我当前的工作目录中有一个子目录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