python3.7.2怎么使用_python3.7.2模块导入问题

首先,每个模块有一个__name__属性,它标识该模块的名称。如果一个模块是通过import的方式导入的,那么它的名称将是包名.模块名,例如import a.b.c,那么c.__name__将是'a.b.c'。而如果是在a目录下from b import c,那么c.__name__将是'b.c'。而如果一个模块是直接用python解释器执行的,它将被认为是top-level module,它的__name__将是__main__。

当使用相对导入时,python是这样查找导入路径的:从该模块的__name__中向上回溯对应的层级,然后尝试在该层级下导入指定的模块。还是上面的那个例子,假如当前c.__name__是'a.b.c',那么在c模块中使用from . import d,python将在包a.b下查找模块d,此时效果相当于import a.b.d。在c模块中使用from .. import e,python将在包a下查找模块e,此时效果相当于import a.e。

而如果在目录a/b下直接执行python c.py会发生什么呢?此时c成为top-level module,它的__name__将会是'__main__',于是当python试图解析c模块中的from . import d语句时,发现当前模块的__name__是__main__,无法向上回溯一个层级,于是报错:ImportError: cannot import name 'd' from '__main__'(在Python2.x中,这个错误将是ValueError: Attempted relative import in non-package)。因此我们得出一个结论:不可以在解释器直接执行的主模块中使用相对导入。

回到题主的问题,那么我偏要在ff.py中使用from . import c怎么做呢?根据上面的结论,此时我们必然不能直接执行ff.py,而是要将它作为一个模块导入执行,方法就是使用python的-m选项。我们需要在trymodule文件夹中执行python -m folder1.ff(注意此时应该使用模块的写法folder1.ff而不是文件路径的写法folder1/ff.py),于是模块ff的__name__就变成了folder1.ff,而此时from . import c将会被解析为import folder1.c,我们的目的也就达到了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值