【问题标题】:Unable to find module/folder despite being in the same directory尽管在同一目录中,但无法找到模块/文件夹
【发布时间】:2022-02-16 08:10:21
【问题描述】:

我正在尝试运行一个调用另一个 python 文件的脚本(连同其整个 github 存储库一起复制),但我得到了一个 ModuleNotFoundError: 尽管将文件放入正确的目录,但还是会这样。

我如何运行它

  1. 激活我的python3.9虚拟环境
  2. (newpy39) aevas@aevas-Precision-7560:~/Desktop/Dashboard_2021_12$ python3 dashboard.py 其中 aevas 是我的用户名,而 ~/Desktop/Dashboard_2021_12 是文件夹

运行它不需要额外的参数。

dashboard.py 的导入

import sys
sys.path.insert(1, 'targetTrack')

# Qt imports
from PyQt5.QtCore import QThread, pyqtSignal

import argparse
import configparser
import platform
import shutil
import time
import cv2
import torch
import torch.backends.cudnn as cudnn


from yolov5.utils.downloads import attempt_download
from yolov5.models.experimental import attempt_load
from yolov5.models.common import DetectMultiBackend
from yolov5.utils.datasets import LoadImages, LoadStreams
from yolov5.utils.general import LOGGER, check_img_size, non_max_suppression, scale_coords, check_imshow, xyxy2xywh
from yolov5.utils.torch_utils import select_device, time_sync
from yolov5.utils.plots import Annotator, colors
from deep_sort_pytorch.utils.parser import get_config
from deep_sort_pytorch.deep_sort import DeepSort

第 1 部分:未找到模型,尽管模型是父文件夹。

python3 dashboard.py 
Traceback (most recent call last):
  File "/home/aevas/Desktop/Dashboard_2021_12/dashboard.py", line 25, in <module>
    from trackerThread import trackerDeepSORT
  File "/home/aevas/Desktop/Dashboard_2021_12/trackerThread.py", line 15, in <module>
    from yolov5.models.experimental import attempt_load
  File "/home/aevas/Desktop/Dashboard_2021_12/targetTrack/yolov5/models/experimental.py", line 14, in <module>
    from models.common import Conv
ModuleNotFoundError: No module named 'models'

第 2 部分:将 import models.common 更改为 import common 后,发现即使在同一个文件夹中也找不到 common!

python3 dashboard.py 
Traceback (most recent call last):
  File "/home/aevas/Desktop/Dashboard_2021_12/dashboard.py", line 25, in <module>
    from trackerThread import trackerDeepSORT
  File "/home/aevas/Desktop/Dashboard_2021_12/trackerThread.py", line 15, in <module>
    from yolov5.models.experimental import attempt_load
  File "/home/aevas/Desktop/Dashboard_2021_12/targetTrack/yolov5/models/experimental.py", line 14, in <module>
    from common import Conv
ModuleNotFoundError: No module named 'common'

这就是文件夹模型中文件的样子

这就是experimental.py的导入部分的样子

# YOLOv5 ???? by Ultralytics, GPL-3.0 license
"""
Experimental modules
"""
import math

import numpy as np
import torch
import torch.nn as nn


from common import Conv
from utils.downloads import attempt_download

我已经查阅了以下链接,但无济于事:

  1. https://towardsdatascience.com/how-to-fix-modulenotfounderror-and-importerror-248ce5b69b1c
  2. Python can't find module in the same folder
  3. ModuleNotFoundError: No module named 'models'
  4. https://github.com/ultralytics/yolov5/issues/353

我明白了,可以改成import .common,然后模块就可以成功导入了。但是,下一行 import utils 会导致类似的错误。 utilsmodels 处于同一级别。这意味着将以这种速度出现一连串的moduleNotFoundError 错误。我也明白使用folder ()方法是不可取的,因此我没有继续使用它。

正如我所提到的,我已经复制了整个克隆的 github 存储库,当独立执行时,github 存储库工作得非常好。 experimental.py 没有区别。

可能出了什么问题?

【问题讨论】:

  • 您能否提供运行脚本的确切方式?您正在运行什么命令,从哪个目录中运行它?因为它决定了 Python 将如何进行导入。
  • @Lenormju 你好,我已经添加了我如何运行它的描述。希望它能阐明您的需求!

标签: python ubuntu


【解决方案1】:

问题在于models 模块位于/home/aevas/Desktop/Dashboard_2021_12/targetTrack/yolov5 文件夹中,但是当您从/home/aevas/Desktop/Dashboard_2021_12/ 运行dashboard.py 时,Python 解释器不会在/home/aevas/Desktop/Dashboard_2021_12/targetTrack/yolov5 文件夹中查找模块;它只显示/home/aevas/Desktop/Dashboard_2021_12/ 中的文件/文件夹。

解决此问题的常用方法是将 yolov5 安装为一个包,但似乎 yolov5 不包含以这种方式安装所需的代码。要解决这个问题,您需要让 Python 知道它需要在 yolov5 文件夹中查找模块。

执行此操作的快捷方式是add the folder to the PYTHONPATH environment variable

在尝试导入 models 模块之前,将 yolov5 文件夹动态添加到 sys.path 是一种稍微不那么快速和肮脏但仍然很丑陋的方法。为此,您可以在dashboard.py 的顶部添加如下内容:

from pathlib import Path
import sys

sys.path.append(str(Path(__file__, "..", "targetTrack", "yolov5").resolve()))

【讨论】:

  • 你好。我实际上尝试使用“sys.path.insert(1,'targetTrack')”,它给了我同样的问题。抱歉,我在主要问题中错过了这一点
  • sys.path 需要文件夹的绝对路径;仅仅添加一个像“targetTrack”这样的相对路径是行不通的。另外,为什么是“targetTrack”而不是“yolov5”?
  • yolov5 文件夹在 targetTrack 中。最后我只使用了 sys.path.insert(1, 'targetTrack') 和 sys.path.insert(1, 'targetTrack/yolov5')
  • 啊,是的,我错过了 targetTrack 文件夹的存在。我已经更新了我的答案以包含它。
  • 另外,关于 sys.path 需要绝对路径,我似乎错了。我对其进行了测试,相对路径也可以工作,至少在 Python 3.9 上是这样。
猜你喜欢
  • 2016-11-12
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多