为什么我不能从 Python 3.4 中的 PYTHONPATH 导入模块?

Why can't I import modules from my PYTHONPATH in Python 3.4?

我在 /u/home/j/joelfred/python-dev-modules 中安装了一个软件包。看起来像:

/a
    __init__.py
    b.py

b.py 的来源很简单:

def hello():
    print('hi yourself')

对于__init__.py

import b

首先,我确保我在我的主目录中,然后设置我的 PYTHONPATH:

$ cd
$ export PYTHONPATH=/u/home/j/joelfred/python-dev-modules/

那我运行python3:

$ python3
Python 3.4.3 (default, Mar 18 2015, 17:28:34) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/u/home/j/joelfred/python-dev-modules/a/__init__.py", line 1, in <module>
    import b
ImportError: No module named 'b'

好吧,这很奇怪。但是,如果我将 __init__.py 更改为空白:

$ python3
Python 3.4.3 (default, Mar 18 2015, 17:28:34) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import a.b as b
>>> b.hello()
hi yourself
>>> 

这到底是怎么回事?

在 Python 3 中,所有导入都是绝对的。你不能做 import b,除非 b 本身是 sys.path 上可用的顶级 module/package。如果要从 a 内部导入 b,请使用显式相对导入:

from . import b