python import 解决由于目录结构问题导致的ModuleNotFoundError

参考:
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会察看默认路径。
    上述都没找到的话,程序就会报错。

下面简单介绍一个例子

  1. 通常,我们自己编写的目录不会含有__init__.py,这个一般是一些第三方包里会有,比如torch云云,下面的讨论不包含导入第三方包的情况。
  2. 一般,我们自己创建的项目含有多级目录时,需要各种各样的跨级导入。为了import层级规范,一律用绝对路径(也就是from... import...形式)来导入,例如from model.stcformer import Model。这样规范化后再保证sys.path内包含相应根目录,就不会出错。
  3. 包含根目录的方法:
    • sys.path.append(os.getcwd()):将当前path添加到sys.path中
    • sys.path.append(“…这里直接写上需要的绝对路径”):将指定需要的绝对路径添加到sys.path中。

在这里插入图片描述

我的问题

  1. 打开终端,将当前路径切换到.../STCFormer-main下后,在终端内键入python demo/vis.py --video sample_video.mp4顺利运行。但是我想debug一下,于是点开demo下的vis文件开始debug,发现model找不到了:
    在这里插入图片描述

注:我这里使用.../...单纯只是省略了前面的路径内容。事实上路径表述中常见的., .., ./, ../都有具体的含义,此处不再赘述。

  1. 经监视sys.path发现,这是因为“点开demo下的vis文件运行”后,现路径自动跳转到demo下,然后sys.path.append(os.getcwd())加入的路径还是.../demo的路径,并没有加入我需要的.../STCFormer-main的路径。
  2. 于是,我把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,肯定也成功导入。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值