python 相对绝对import

it2022-05-05  161

 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等。


最新回复(0)