文件结构和可能存在的引用链条
现在有这样一个文件夹
1 | root |
IMPORTANT
- 我使用的是
python3.11
,该版本中不需要__init__.py
也能把文件夹变成一个package
。 - 如果你不能引入子文件夹,则直接在该文件夹中新建一个
__init__.py
,内容为空。
可能存在的引用链条有
a -> d -> b(引用父文件)
python 1
2
3
4# a.py
import d
# d.py
import ba -> d -> x -> e(引用子文件后再引用其父文件)
a -> b -> c
a -> d -> x -> c
非运行入口文件和运行入口文件
IMPORTANT
一定要区分哪个是运行入口文件!
在python a.py
中,a.py
就是运行入口文件,其他的都不是。如果你cd dir1 & python e.py
,那么a.py
就不是运行入口文件了,e.py
才是。一般
而言运行入口文件使用绝对引入。
a -> d -> b(引用父文件)
1 | # a.py |
如果你这么写的话一定会报错的,Attempted relative import with no known parent package,不报错你也不会来看我的博客()
这里假设a.py
是运行入口文件,正确的写法是直接import b
,这是因为b.py
和a.py
同级,也就是说如果是要引入同运行入口文件同级的.py
,则直接import
就可以。
a -> d -> x -> e(引用子文件后再引用其父文件)
这个在d.py
中就是正常的from .dir1 import x
,但是需要注意的是,在x.py
中需要使用from .. import e
,这和上面那个引用父文件的方法不一样,所以说一定要注意哪个才是运行入口文件!!
在运行入口文件中引用其父文件
不是不可以,其实没什么必要这么做,因为如果后续要继续改的话会频繁出错,例如如果存在另一个同级或非同级的文件,此文件要引用原来的运行入口文件,那么原运行入口文件所引用的文件很可能就引用失败。
所以我看有些库,例如requests
,官方的asyncio
都是只有一个层级,大家都是非运行入口文件,互相引用的时候都是用相对引入。
如果你真的要在运行入口文件中引用其父文件,那么这样写
1 | import sys |