Python 在uuu init_uuuuuuuuuu.py和`import as`语句中导入

Python 在uuu init_uuuuuuuuuu.py和`import as`语句中导入,python,python-3.x,Python,Python 3.x,我遇到了一个问题,在\uuu init\uuuu.py中有导入,并且在包的模块中使用导入为 我的项目有一个子包,在它的\uuuu init\uuuuuu.py中,我使用从导入为语句将一个类从模块“提升”到子包级别。模块使用绝对导入从该子包导入其他模块。我得到这个错误AttributeError:“module”对象没有属性“subpkg” 例子 结构: pkg/ ├── __init__.py ├── subpkg │   ├── __init__.py │   ├── one.py │   └

我遇到了一个问题,在
\uuu init\uuuu.py
中有导入,并且在包的模块中使用
导入为

我的项目有一个子包,在它的
\uuuu init\uuuuuu.py
中,我使用
从导入为
语句将一个类从模块“提升”到子包级别。模块使用绝对导入从该子包导入其他模块。我得到这个错误
AttributeError:“module”对象没有属性“subpkg”

例子 结构

pkg/
├── __init__.py
├── subpkg
│   ├── __init__.py
│   ├── one.py
│   └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two

class One(two.Two):
    pass
class Two:
    pass
from pkg.subpkg import One

print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
    from pkg.subpkg.one import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
    import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
    from pkg.subpkg.one import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
    ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
pkg/\uuuu init\uuuu.py为空

pkg/subpkg/__;u init.py

pkg/
├── __init__.py
├── subpkg
│   ├── __init__.py
│   ├── one.py
│   └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two

class One(two.Two):
    pass
class Two:
    pass
from pkg.subpkg import One

print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
    from pkg.subpkg.one import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
    import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
    from pkg.subpkg.one import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
    ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
pkg/subkg/one.py

pkg/
├── __init__.py
├── subpkg
│   ├── __init__.py
│   ├── one.py
│   └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two

class One(two.Two):
    pass
class Two:
    pass
from pkg.subpkg import One

print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
    from pkg.subpkg.one import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
    import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
    from pkg.subpkg.one import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
    ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
pkg/subpkg/two_longname.py

pkg/
├── __init__.py
├── subpkg
│   ├── __init__.py
│   ├── one.py
│   └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two

class One(two.Two):
    pass
class Two:
    pass
from pkg.subpkg import One

print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
    from pkg.subpkg.one import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
    import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
    from pkg.subpkg.one import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
    ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
包装/tst.py

pkg/
├── __init__.py
├── subpkg
│   ├── __init__.py
│   ├── one.py
│   └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two

class One(two.Two):
    pass
class Two:
    pass
from pkg.subpkg import One

print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
    from pkg.subpkg.one import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
    import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
    from pkg.subpkg.one import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
    ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
输出

pkg/
├── __init__.py
├── subpkg
│   ├── __init__.py
│   ├── one.py
│   └── two_longname.py
└── tst.py
from pkg.subpkg.one import One
import pkg.subpkg.two_longname as two

class One(two.Two):
    pass
class Two:
    pass
from pkg.subpkg import One

print(One)
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
    from pkg.subpkg.one import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
    import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'
from pkg.subpkg.one import ONE
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
TWO = 2
from pkg.subpkg import ONE
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
    from pkg.subpkg.one import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
    ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
import pkg.subpkg.two as two
ONE = two.TWO
这里唯一的缺点是我不能为模块创建短别名。我从@begueradj的回答中得到了这个想法

也可以在
one.py
中使用相对导入来解决问题。但我认为这只是变通办法2的一种变体

问题
  • 有人能解释一下这里到底发生了什么吗?为什么在
    \uuu init\uuuu.py
    中同时导入和使用
    导入为
    会导致此类问题

  • 有更好的解决办法吗


  • 原样 这是我最初的例子。这不太现实,但我不会删除它,所以@begueradj的答案仍然有意义

    pkg/\uuuu init\uuuu.py为空

    pkg/subpkg/__;u init.py

    pkg/
    ├── __init__.py
    ├── subpkg
    │   ├── __init__.py
    │   ├── one.py
    │   └── two_longname.py
    └── tst.py
    
    from pkg.subpkg.one import One
    
    import pkg.subpkg.two_longname as two
    
    class One(two.Two):
        pass
    
    class Two:
        pass
    
    from pkg.subpkg import One
    
    print(One)
    
    $ python3.4 -m pkg.tst
    Traceback (most recent call last):
      File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
        "__main__", mod_spec)
      File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
        from pkg.subpkg import One
      File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
        from pkg.subpkg.one import One
      File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
        import pkg.subpkg.two_longname as two
    AttributeError: 'module' object has no attribute 'subpkg'
    
    from pkg.subpkg.one import ONE
    
    import pkg.subpkg.two
    ONE = pkg.subpkg.two.TWO
    
    TWO = 2
    
    from pkg.subpkg import ONE
    
    $ python3.4 -m pkg.tst
    Traceback (most recent call last):
      File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
        "__main__", mod_spec)
      File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
        from pkg.subpkg import ONE
      File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
        from pkg.subpkg.one import ONE
      File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
        ONE = pkg.subpkg.two.TWO
    AttributeError: 'module' object has no attribute 'subpkg'
    
    import pkg.subpkg.two as two
    ONE = two.TWO
    
    pkg/subkg/one.py

    pkg/
    ├── __init__.py
    ├── subpkg
    │   ├── __init__.py
    │   ├── one.py
    │   └── two_longname.py
    └── tst.py
    
    from pkg.subpkg.one import One
    
    import pkg.subpkg.two_longname as two
    
    class One(two.Two):
        pass
    
    class Two:
        pass
    
    from pkg.subpkg import One
    
    print(One)
    
    $ python3.4 -m pkg.tst
    Traceback (most recent call last):
      File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
        "__main__", mod_spec)
      File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
        from pkg.subpkg import One
      File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
        from pkg.subpkg.one import One
      File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
        import pkg.subpkg.two_longname as two
    AttributeError: 'module' object has no attribute 'subpkg'
    
    from pkg.subpkg.one import ONE
    
    import pkg.subpkg.two
    ONE = pkg.subpkg.two.TWO
    
    TWO = 2
    
    from pkg.subpkg import ONE
    
    $ python3.4 -m pkg.tst
    Traceback (most recent call last):
      File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
        "__main__", mod_spec)
      File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
        from pkg.subpkg import ONE
      File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
        from pkg.subpkg.one import ONE
      File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
        ONE = pkg.subpkg.two.TWO
    AttributeError: 'module' object has no attribute 'subpkg'
    
    import pkg.subpkg.two as two
    ONE = two.TWO
    
    pkg/subkg/two.py

    pkg/
    ├── __init__.py
    ├── subpkg
    │   ├── __init__.py
    │   ├── one.py
    │   └── two_longname.py
    └── tst.py
    
    from pkg.subpkg.one import One
    
    import pkg.subpkg.two_longname as two
    
    class One(two.Two):
        pass
    
    class Two:
        pass
    
    from pkg.subpkg import One
    
    print(One)
    
    $ python3.4 -m pkg.tst
    Traceback (most recent call last):
      File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
        "__main__", mod_spec)
      File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
        from pkg.subpkg import One
      File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
        from pkg.subpkg.one import One
      File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
        import pkg.subpkg.two_longname as two
    AttributeError: 'module' object has no attribute 'subpkg'
    
    from pkg.subpkg.one import ONE
    
    import pkg.subpkg.two
    ONE = pkg.subpkg.two.TWO
    
    TWO = 2
    
    from pkg.subpkg import ONE
    
    $ python3.4 -m pkg.tst
    Traceback (most recent call last):
      File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
        "__main__", mod_spec)
      File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
        from pkg.subpkg import ONE
      File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
        from pkg.subpkg.one import ONE
      File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
        ONE = pkg.subpkg.two.TWO
    AttributeError: 'module' object has no attribute 'subpkg'
    
    import pkg.subpkg.two as two
    ONE = two.TWO
    
    包装/tst.py

    pkg/
    ├── __init__.py
    ├── subpkg
    │   ├── __init__.py
    │   ├── one.py
    │   └── two_longname.py
    └── tst.py
    
    from pkg.subpkg.one import One
    
    import pkg.subpkg.two_longname as two
    
    class One(two.Two):
        pass
    
    class Two:
        pass
    
    from pkg.subpkg import One
    
    print(One)
    
    $ python3.4 -m pkg.tst
    Traceback (most recent call last):
      File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
        "__main__", mod_spec)
      File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
        from pkg.subpkg import One
      File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
        from pkg.subpkg.one import One
      File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
        import pkg.subpkg.two_longname as two
    AttributeError: 'module' object has no attribute 'subpkg'
    
    from pkg.subpkg.one import ONE
    
    import pkg.subpkg.two
    ONE = pkg.subpkg.two.TWO
    
    TWO = 2
    
    from pkg.subpkg import ONE
    
    $ python3.4 -m pkg.tst
    Traceback (most recent call last):
      File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
        "__main__", mod_spec)
      File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
        from pkg.subpkg import ONE
      File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
        from pkg.subpkg.one import ONE
      File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
        ONE = pkg.subpkg.two.TWO
    AttributeError: 'module' object has no attribute 'subpkg'
    
    import pkg.subpkg.two as two
    ONE = two.TWO
    
    输出

    pkg/
    ├── __init__.py
    ├── subpkg
    │   ├── __init__.py
    │   ├── one.py
    │   └── two_longname.py
    └── tst.py
    
    from pkg.subpkg.one import One
    
    import pkg.subpkg.two_longname as two
    
    class One(two.Two):
        pass
    
    class Two:
        pass
    
    from pkg.subpkg import One
    
    print(One)
    
    $ python3.4 -m pkg.tst
    Traceback (most recent call last):
      File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
        "__main__", mod_spec)
      File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
        from pkg.subpkg import One
      File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
        from pkg.subpkg.one import One
      File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
        import pkg.subpkg.two_longname as two
    AttributeError: 'module' object has no attribute 'subpkg'
    
    from pkg.subpkg.one import ONE
    
    import pkg.subpkg.two
    ONE = pkg.subpkg.two.TWO
    
    TWO = 2
    
    from pkg.subpkg import ONE
    
    $ python3.4 -m pkg.tst
    Traceback (most recent call last):
      File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
        "__main__", mod_spec)
      File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
        exec(code, run_globals)
      File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
        from pkg.subpkg import ONE
      File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
        from pkg.subpkg.one import ONE
      File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
        ONE = pkg.subpkg.two.TWO
    AttributeError: 'module' object has no attribute 'subpkg'
    
    import pkg.subpkg.two as two
    ONE = two.TWO
    

    在这种情况下,我在导入时出错(就像在我的原始项目中一样,它也使用
    导入为

    关于调用模块的方式,您的项目结构必须如下所示:

    pkg/
    ├── __init__.py
    ├── subpkg
    │   ├── __init__.py
    │   ├── one.py
    │   └── two.py
    tst.py
    
    class TWO:
        def functionTwo(self):
            print("2")
    
    如下定义您的two.py

    pkg/
    ├── __init__.py
    ├── subpkg
    │   ├── __init__.py
    │   ├── one.py
    │   └── two.py
    tst.py
    
    class TWO:
        def functionTwo(self):
            print("2")
    
    如下定义您的one.py

    from pkg.subpkg import two
    class ONE:
        def functionOne(self):
            print("1")
    
            self.T=two.TWO()
            print("Calling TWO from ONE: ")
            self.T.functionTwo()
    
    像这样定义您的test.py

    from pkg.subpkg import one
    class TEST:
        def functionTest(self):
            O=one.ONE()
            O.functionOne()
    if __name__=='__main__':
        T=TEST()
        T.functionTest()
    
    执行时,您将得到以下结果:

    1
    Calling  TWO from  ONE:
    2
    

    希望这能有所帮助。

    这里有一个关于发生了什么的理论

    当您将
    用作
    保留字时,例如:

    import pkg.subpkg.two_longname as two
    
    Python必须完全初始化并解决与
    pkg.subpkg
    有关的所有依赖关系。但是有一个问题,要完全加载
    subkg
    ,您还需要完全加载
    one.py,对吗?wich同时使用
    as
    关键字导入
    two_longname.py
    。。。你能看到这里的递归吗?这就是为什么在做这件事的时候:

    import pkg.subpkg.two_longname as two
    
    您会收到一个错误,声称
    subpkg
    不存在

    要执行测试,请转到one.py并将其更改为:

    #import pkg.subpkg.two_longname as two
    from pkg.subpkg import two_longname
    
    #class One(two.Two):
    class One(two_longname.Two):
        pass
    

    我想这都是关于性能的,只要有可能,Python就会部分加载模块。而
    as
    关键字是例外情况之一。我不知道是否还有其他人,但了解他们会很有趣。

    您错误地认为一个人不能有来自的
    别名。。。从…导入
    ,作为
    。。。导入。。。自Python 2.0以来,as一直存在。
    导入。。。as
    是一种晦涩难懂的语法,不是很多人都知道,但您在代码中意外地使用了它

    声称以下2项“实际上”相同:

  • 将foo.bar.bazaar导入为baz
  • 来自foo.bar进口商场作为baz
  • 这句话在3.6.x之前(含3.6.x)的Python版本中并不完全正确,正如您遇到的一个案例所证明的,即如果所需的模块已经存在于
    sys.modules
    中,但尚未初始化。
    导入。。。as
    要求模块
    foo.bar
    作为属性
    bar
    插入
    foo.bar
    命名空间中,除了位于
    sys.modules
    中之外,而来自。。。导入。。。as
    sys.modules
    中查找
    foo.bar

    (请注意,
    import foo.bar
    仅确保模块
    foo.bar
    位于
    sys.modules
    中,并且可以作为
    foo.bar
    访问,但可能尚未完全初始化。)

    按以下方式更改代码为我带来了好处:

    # import pkg.subpkg.two_longname as two
    from pkg.subpkg import two_longname as two
    
    代码在Python2和Python3上都能完美运行

    此外,出于同样的原因,在
    one.py
    中,您不能从pkg import subkg执行


    要进一步演示此错误,请如上所述修复
    one.py
    ,并在
    tst.py
    中添加以下代码:

    from pkg.subpkg import two_longname
    
    class One(two_longname.Two):
        pass
    
    import pkg
    import pkg.subpkg.two_longname as two
    
    del pkg.subpkg
    
    from pkg.subpkg import two_longname as two
    import pkg.subpkg.two_longname as two
    
    只有最后一行崩溃,因为来自。。。import
    pkg.subpkg
    查询
    sys.modules
    ,并在那里找到它,而
    import。。。as
    pkg
    查阅
    sys.modules
    ,并尝试在
    pkg
    模块中作为属性查找
    subpkg
    。由于我们刚刚删除了该属性,最后一行失败,出现了
    AttributeError:“module”对象没有属性“subpkg”



    由于
    import foo.bar As baz
    语法有点晦涩,并且添加了更多的角格,而且我很少看到它被使用,因此我建议完全避免使用它,并从中选择
    。。导入。。。正如公认的答案所说,这是Python行为的一个问题

    我提出了一个错误:


    Serhiy Storchaka的修复是在Python 3.7中合并的,我的理解是,将导入内容的使用转移到函数中会有所帮助,因为它允许Python先导入所有内容,然后开始使用它。然而,这并不总是可能做到的。例如,导入一个超类。也许我应该将我的示例建立在这个案例的基础上,使其更加真实。另外,我注意到您使用了
    from pkg.subpkg import two
    而不是
    将pkg.subpkg.two导入为two
    。这