Python中的Attempted relative import in non-package问题

最近在帮一个伙伴debug的时候发现,在一个package的内部,直接run一个.py文件,会报错说ValueError: Attempted relative import in non-package

原来这是因为,当我run的这个.py文件,如果它在某个package的文件夹下,而且这个.py文件夹内有诸如:

from . import
from .. import

相对导入(relative import)的语句,那么就会报错。

因为:

Relative imports use a module’s name attribute to determine that module’s position in the package hierarchy.

意思就是说,python import package都是根据每个module的__name__来实现的。
比如说,有一个文件夹结构为:

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
    moduleA.py

那么,如果(在这个package文件夹之外,比如package的同级文件夹下建立运行一个run.py)运行一个script,来导入moduleX模块,那么这个moduleX的__name__就是.package.subpackage1.moduleX,由于moduleX获得了前述名称,那么在moduleX.py内部就可以有relative import的语句,比如说:

from .. import moduleA

而moduleX之所以能够获得的.package.subpackage1.moduleX__name__ attribute属性,前提是package被python解释器识别成了一个package来处理(比如在package的同级文件夹下的运行的run.py有import package.subpackage1.moduleX之类的语句)。可是,如果每一个被我直接run的python script都会被视作是top-level script。top-level script的__name__被自动设置成__main__。因此,如果我从package文件夹内部直接运行moduleA.py这个脚本,那么它的__name__就被置成了__main__,python也不会把它当作一个package,其中的relative import的语句自然就无法起作用了。

Note that relative imports are based on the name of the current module. Since the name of the main module is always “__main__”, modules intended for use as the main module of a Python application must always use absolute imports.

参考:
https://docs.python.org/3/tutorial/modules.html#intra-package-references
https://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time#answer-14132912

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值