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

  • 相关阅读:
    225. 用队列实现栈
    415. 字符串相加
    rabbitmq的基本使用
    3. 无重复字符的最长子串
    面试题59
    面试题30. 包含min函数的栈
    面试题09. 用两个栈实现队列
    287. 寻找重复数
    1137. 第 N 个泰波那契数
    70. 爬楼梯
  • 原文地址:https://www.cnblogs.com/zhouyang209117/p/7446544.html
Copyright © 2011-2022 走看看