【问题标题】:python package: can't import a class from working directorypython包:无法从工作目录导入类
【发布时间】:2021-12-25 03:49:40
【问题描述】:

在我当前的工作目录中有一个子目录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 实现了一个类FAC,这样:

class FAC:

    def __init__(self):

        pass
    ...

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

File: AdaBoostM1.py

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

但奇怪的是,这些文件无法导入该类。例如:

$ 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 类。

$ 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.py 在您执行from cpuimlearn import AdaBoostM1 时不在当前工作目录中。看起来 cwd 是 ~/gpuimlearn/src/CPU-imLearn

标签: python python-3.x python-import python-packaging


【解决方案1】:

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

from .factory import FAC

或全名导入

from cpuimlearn.factory import FAC

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

【讨论】:

    【解决方案2】:

    factory 不是一个包。

    您需要使用相对导入:

    from .factory import FAC

    或者: from cpuimlearn.factory import FAC

    【讨论】:

    • factory 不是包的信息不正确。 python中的包是__init__.py的目录名称。因此,如果您将带有__init__.py 的目录放在另一个带有__init__.py 的目录中,您将在包中获得一个包。我认为您想写“factory 不是顶级包”
    猜你喜欢
    • 2021-10-23
    • 2016-12-27
    • 2012-07-08
    • 1970-01-01
    • 2021-10-06
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多