对于
my_test - - ansemb
- - - - __init__.py
- - - - config.py
- - - - dataset
- - - - - - test.py
- - fine.py
这个目录而言(粗体是文件夹)
因为__init__.py的存在使得ansemb变成包,
从而,同级目录下的fine.py可以调用其中任何一个文件。
__init__.py 文件定义了包bai的属性和方法。其实它可以什么也不定义;可以只是一个空文件,但是必须存在。如果 __init__.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。
config.py中我定义:
def ok():
print(1)
bb = 1
cc = 2
我在test.py中可以引用上层目录下config.py的文件:
from ansemb.config import *
bb=bb
cc=cc
ok()
但是,这里很关键:我不能执行test.py,因为此时config.py在其上层目录中。
但是,我可以通过在fine.py中定义如下语句:
import ansemb.dataset.test as data
data.ok()
print(data.bb, data.cc)
来间接使用到test.py对于config.py的调用。
这是因为python是一种解释性质的语言,执行过程是顺序的,所以上述过程,相当于在fine.py中执行了:
from ansemb.config import *
这是可行的(config.py在其下层目录中)。
作为一个规范的代码。最好不要随便跨层次调用上层的库。如果实在要执行该步骤(test.py执行过程中调用config.py),最好的办法是把ansemb这个包的路径使用:
sys.path.append()
命令,将其放到执行路径中。
此时test.py完整代码如下
import os.path as osp
import sys
osp.dirname(__file__) #得到当前文件所在路径
osp.abspath(osp.join(this_dir, '..')) #得到绝对路径
sys.path.append(project_root) #加入运行时路径
from config import *