python 2.7导入模块问题

有如下结构的python文件

base
   |----pkg1
           |----__init__.py
           |----add.py
   |----pkg2
           |----__init__.py
           |----call_func.py

add.py的内容为:

# coding:utf-8
def add(a, b):
    return a + b

call_func.py的内容为

# coding:utf-8
from ...pkg1.add import add
print(add(1, 1))

在pkg2下运行

python call_func.py

会报下面的错误

ValueError: Attempted relative import in non-package

错误的意思是"没有包的情况下尝试相对导入".为什么?
这就涉及到python 2的模型名问题.再看下面的例子.

base1
   |----pkg3
           |----__init__.py
           |----add1.py
   |----call_func1.py

add1.py的内容为

# coding:utf-8
def add(a, b):
    print __name__
    return a + b

call_func1.py的内容如下

# coding:utf-8
from pkg1.add import add
print (__name__)
print(add(1, 1))

运行call_func1.py文件,输出为

__main__
pkg1.add
2

可以得到这样一个结论:*程序入口的模块名是__main__,被调用的模块是包名.模块名*. 这就能解释ValueError: Attempted relative import in non-package这个错误了.在第一个工程中call_func.py为程序入口,所以模块名是__main__,根据没有包名作前缀,所以肯定报错.
如何能让call_func.py运行起来?把

from ...pkg1.add import add

改为

from pkg1.add import add

在base目录下执行

python -m pkg2.call_func

让call_func在base目录下找pkg1.add,是能找到的.

参考资料

Relative imports for the billionth time

posted on 2017-08-29 07:55  荷楠仁  阅读(1000)  评论(0编辑  收藏  举报

导航