首页 > 解决方案 > 为什么绝对导入在 Python 2 中失败,但在 Python3 中成功?

问题描述

在摆弄 Python 导入系统时,我注意到这种形式的绝对导入在 Python 3.6.8 中运行良好,但ImportError在 Python 2.7.17 中运行良好。包结构如下:

├── main8.py
├── pkg_a
│   ├── __init__.py
│   ├── mod7.py
│   ├── pkg_c
│   │   ├── __init__.py
│   │   ├── mod2.py

main8.py

import pkg_a.mod7

pkg_a/mod7.py

import pkg_a.pkg_c.mod2

pkg_a/pkg_c/mod2.py

print('Imported pkg_a.pkg_c.mod2')

如果我main8.py使用 Python3执行,则会pkg_a.pkg_c.mod2成功导入。

$ python3 main8.py 
Imported pkg_a.pkg_c.mod2

但是,如果我main8.py使用 Python2 执行,它会抛出一个ImportError.

$ python2 main8.py 
Traceback (most recent call last):
  File "main8.py", line 1, in <module>
    import pkg_a.mod7
  File "pkg_a/mod7.py", line 1, in <module>
    import pkg_a.pkg_c.mod2
ImportError: No module named pkg_c.mod2

from __future__ import absolute_import在顶部添加指令main8.pypkg_a/mod7.py没有帮助。谁能解释一下为什么 Python2 导入会这样?

标签: pythonpython-3.xpython-2.7python-importimporterror

解决方案


对于 Python2,你需要一个__init__.pynext tomain8.py来制作一个包:

.
├── __init__.py
├── main8.py
└── pkg_a
    ├── __init__.py
    ├── __init__.pyc
    ├── mod7.py
    ├── mod7.pyc
    └── pkg_c
        ├── __init__.py
        ├── __init__.pyc
        ├── mod2.py
        └── mod2.pyc

2 directories, 10 files

跑步:

>> /usr/bin/python2.7 ./main8.py
Imported pkg_a.pkg_c.mod2

>> python3 ./main8.py
Imported pkg_a.pkg_c.mod2

推荐阅读