python 相对绝对import

 Pycharm等python IDE中有如下目录结构:

package1/
    __init__.py
    SubPack1/
        __init__.py
        module_11.py
        module_12.py
        module_13.py
    SubPcak2/
        __init__.py
        module_21.py
        module_22.py
    ...

其中module_11.py如下

def hello():
    print('hello world!')

然后我们想在同一目录下module_12.py引用module_11.py中的hello()函数,可如下编写module_12.py

#方式一
from . import module_11
module_11.hello()

#方式二 
from .module_11 import hello
hello()

#方式三
import module_11
module_11.hello()

如果直接对module_12.py 调试, python module_12.py 

方式一和二均会报错误,错误信息如下 no module_11__main__.module_11 is not a package 

方式三可正常通过调试。

 

然后此处package目录下都有__init__.py文件,所以说明这些都是python包,理应没有错误。但是为什么方式一和二会报上述错误呢?网上很多人说是pycharm没有marked source rooted以及没有__init__.py这中问题。显然此处不是这个问题!!

仔细观察 __main__ 是什么? 这不就是python为每个模块单独调试时候分配的名字嘛?所以当你在前述module_12.py中直接调试方式一和方式二的时候,此时模块的名字为__main__,然后替换 相对路径 "."为 __main__。所以才会找不到路径。

然后如果我们在module_13.py编写如下

import module_12

此时module_12用方式一或者方式二都能通过编译。 因此此时module_12.py的模块名不再是 __main__,而是其模块的名字 module_12。所以 "."为当前路径,就能根据相对路径顺利找到需要导入的包了。

总结一下,python可以分模块调试,此时__name__(前文所说的模块名)都被赋值为 __main__, 但是当此模块被其他模块引用时,这个被引用模块的名字为其module名称,如前文的module_11等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值