代码之家  ›  专栏  ›  技术社区  ›  arilwan

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

  •  0
  • arilwan  · 技术社区  · 4 年前

    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 在目录中可用,并且此实现

    $ 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
    
    2 回复  |  直到 4 年前
        1
  •  1
  •   Grzegorz Bokota    4 年前

    像你一样 __init__.py 在您的目录中,则该目录被视为python包。 要在python包内导入,需要使用相对导入

    from .factory import FAC
    

    或全名导入

    from cpuimlearn.factory import FAC
    

    https://docs.python.org/3/tutorial/modules.html

        2
  •  1
  •   gshpychka    4 年前

    factory 这不是一个包裹。

    您需要使用相对导入:

    from .factory import FAC

    或者: from cpuimlearn.factory import FAC