zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    几何——BAPC2019 K
    dsu on tree —— BAPC2019 A
    概率dp——BAPC2019 L
    计算几何+三分求极值——cf1046I
    上下文管理器
    转 -- 一行式
    转--python 基础
    转--python 面试题
    转 -- Python: 多继承模式下 MRO(Method Resolution Order) 的计算方式关乎super
    转--python之正则入门
  • 原文地址:https://www.cnblogs.com/zhouyang209117/p/7446544.html
Copyright © 2011-2022 走看看