zoukankan      html  css  js  c++  java
  • python某个module使用了相对引用,同时其__name__又是__main__导致的错误

    主要讲解 某个module中使用了相对引用,同时这个module的 __name__ 属性 又是 __main__ 会报错的问题

    1、问题复现

    文件结构很简单:

    |--------package

    |    ├── __init__.py
    |    ├── base.py
    |    └── derived.py

    |--------main.py

    各个文件内容如下:

    #base.py
    def
    testfun(): print('base')
    #derived.py
    from .base import testfun
    testfun()

    然后 cd到 derived.py 所在目录,执行  python derived.py

    报错:  

    ModuleNotFoundError: No module named '__main__.base'; '__main__' is not a package

    2、问题原因-----使用了相对引用的module的__name__ 属性是 __main__ 的时候,会导致错误


    这里使用了相对引用:主要是对于使用了相对引用的python文件,会利用 这个文件的 __name__ 属性 定位相对引用的package。

    如果 那个python文件 是 __main__(也就是说不包含任何package信息) ,那么相对引用会被解析成 top level module,而不关注 这个 module 是否存在于文件系统中

    此外 如果直接执行  python 文件名.py 的时候,这个文件名.py 对应的module __name__ 值就是  '__main__'

    3、解决办法

    包含相对引用的 module,不要直接利用  解释器执行,也就是说这个module的 __name__ 属性不要作为 __main__, 可以 加入一个 main.py 文件,作为入口,同时这个main.py 文件不包含相对引用

    4、引申一点 关于相对引用的集中情况

    ################import可以引入一个 module,可以引入一个函数

    #
    Import 同一個 package 底下的 sibling module `moduleY` [A] from package.subpackage1 import moduleY [R] from . import moduleY [Error] import .moduleY # 從同一個 package 底下的 sibling module `moduleY` 中的函数 spam [A] from package.subpackage1.moduleY import spam [R] from .moduleY import spam # 從隔壁 package 底下的 module `moduleZ`中的函数 eggs [A] from package.subpackage2.moduleZ import eggs [R] from ..subpackage2.moduleZ import eggs # Import parent package 底下的 module `moduleA` [A] from package import moduleA [R] from .. import moduleA 或 from ... package import moduleA

    5、参考文献:

    https://medium.com/pyladies-taiwan/python-%E7%9A%84-import-%E9%99%B7%E9%98%B1-3538e74f57e3

  • 相关阅读:
    [LeetCode] Power of Three 判断3的次方数
    [LeetCode] 322. Coin Change 硬币找零
    [LeetCode] 321. Create Maximum Number 创建最大数
    ITK 3.20.1 VS2010 Configuration 配置
    VTK 5.10.1 VS2010 Configuration 配置
    FLTK 1.3.3 MinGW 4.9.1 Configuration 配置
    FLTK 1.1.10 VS2010 Configuration 配置
    Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别
    [LeetCode] Bulb Switcher 灯泡开关
    [LeetCode] Maximum Product of Word Lengths 单词长度的最大积
  • 原文地址:https://www.cnblogs.com/amazement/p/10341328.html
Copyright © 2011-2022 走看看