python绝对引用和相对引用
Python杂谈: init.py的作用
当python文件A中使用到相对路径导入B时,直接运行A文件会显示找不到B。但将A作为模块或者库的一部分,在其他文件中导入A,此时又能顺利找到B。具体可看以下内容:
1.文件结构
2.文件代码
2.1 package/file1.py
def file1_fun():
pass
if __name__ == '__main__':
print("this is file1")
2.2 package/file2.py
from . import file1
def file2_fun():
pass
if __name__ == '__main__':
print("this is file2")
2.3 file3.py
from package.file2 import file2_fun
if __name__ == "__main__":
file2_fun()
3.问题阐述
查看代码我们可知,file2文件里通过相对路径法导入了file1文件,但是直接右键运行file2文件,会出现以下错误:无法找到file1文件
Traceback (most recent call last):
File "/home/hovexb/CODE/import_test/package/file2.py", line 1, in <module>
from . import file1
ImportError: cannot import name 'file1'
而将含相对路径的file2作为module,在file3中导入file2,则file3正常运行
4.原因分析
由PEP 328可知:
Relative imports use a module’s name attribute to determine that module’s position in the package hierarchy. If the module’s name does not contain any package information (e.g. it is set to ‘main’) then relative imports are resolved as if the module were a top level module, regardless of where the module is actually located on the file system.
相对路径引用使用__name__
这一属性指示模块在包里的位置信息,当直接运行file2.py时,__name__=__main__
则认为该文件位于根模块,而不管该文件真正的位置。
但file2被用做模块在file3中导入时,file2中的__name__=package.file2
,由此file2就能通过相对路径正确定位到file1文件。