参考:
https://blog.csdn.net/weixin_44546620/article/details/104755730
https://www.cnblogs.com/tjp40922/p/13052553.html
https://www.runoob.com/python/python-modules.html
https://blog.csdn.net/yzy_1996/article/details/119482223
https://blog.csdn.net/Kwoky/article/details/120870434
我们先搞清楚一下导入的相关知识
- Python中:
- 一个.py文件就称之为一个模块(Module)
- 包含.py文件的文件夹,且里面含有一个__init_.py的文件夹称为包(Package)
对于一个文件夹/目录(后统称目录),Python会通过搜索该目录下的文件来导入相关的模块。但是并不是所有的目录都会被搜索添加,只有当目录中包含__init__.py文件时,这个目录才会被Python当作是一个包目录,进而搜索添加里面的文件。这样做可以让编程者自己控制哪些目录可以被Python导入成包。
python导入包或模块时,会根据sys.path列表里的路径寻找这些包或模块,遵循以下顺序:
- 当前目录
- 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
- 如果都找不到,Python会察看默认路径。
上述都没找到的话,程序就会报错。
下面简单介绍一个例子
- 通常,我们自己编写的目录不会含有
__init__.py
,这个一般是一些第三方包里会有,比如torch
云云,下面的讨论不包含导入第三方包的情况。 - 一般,我们自己创建的项目含有多级目录时,需要各种各样的跨级导入。为了import层级规范,一律用绝对路径(也就是
from... import...
形式)来导入,例如from model.stcformer import Model
。这样规范化后再保证sys.path内包含相应根目录,就不会出错。 - 包含根目录的方法:
- sys.path.append(os.getcwd()):将当前path添加到sys.path中
- sys.path.append(“…这里直接写上需要的绝对路径”):将指定需要的绝对路径添加到sys.path中。
我的问题
- 打开终端,将当前路径切换到
.../STCFormer-main
下后,在终端内键入python demo/vis.py --video sample_video.mp4
顺利运行。但是我想debug一下,于是点开demo下的vis文件开始debug,发现model找不到了:
注:我这里使用
.../
的...
单纯只是省略了前面的路径内容。事实上路径表述中常见的.
,..
,./
,../
都有具体的含义,此处不再赘述。
- 经监视sys.path发现,这是因为“点开demo下的vis文件运行”后,现路径自动跳转到demo下,然后sys.path.append(os.getcwd())加入的路径还是
.../demo
的路径,并没有加入我需要的.../STCFormer-main
的路径。 - 于是,我把vis.py的副本放到
.../STCFormer-main
下,并做如下改动:
- vis.py移到
.../STCFormer-main
下,则sys.path.append(os.getcwd())加入的路径就是.../STCFormer-main
,这样from model.stcformer import xxx
肯定没问题from lib.preprocess import xxx
前sys.path加入.../demo
,肯定也成功导入。