【问题标题】:Python import ModuleNotFoundErrorPython 导入 ModuleNotFoundError
【发布时间】:2021-10-26 08:37:12
【问题描述】:

我有一个 Python 项目,我正在使用 PyCharm 在本地 PC 上工作,我从 Google Colab 服务器执行代码(因为我需要 GPU)。

我使用 GitHub 将我的项目上传到 Colab(我将包上传到 GitHub,然后在 Colab 中克隆它)。

但是,我在导入方面遇到问题。

包结构是这样的:

a/
->b/
  ->c/
    -> script1.py
    -> script2.py
  ->d/
    -> script3.py

script1.py 导入 script2.py 和 script3.py。

我尝试这样导入:

import script2
from b.d import script3

这是我的测试用例:

  • 在我的 PC 本地,主脚本位于文件夹 a

  • 远程在 Google Colab 上,主要脚本是笔记本(显然在文件夹 a 之外)。

在这两种情况下,我的导入都会得到 ModuleNotFoundError

但如果我像这样使用相对导入:

from . import script2
from ..d import script3

它在上述两种情况下都很好用,但是 PyCharm 抱怨相对导入,并且脚本只会在主文件夹位于 b 之外时执行。

我尝试将__init__.py 添加到文件夹d,但老实说,我仍然不完全理解这些文件的用途。从我读到的内容来看,它们在 Python 3.3+ 中是多余的(我使用 Python 3.7)。

所以我的问题是:无论主脚本的位置如何,我怎样才能使导入随时工作?

提前致谢

【问题讨论】:

    标签: python python-3.x import


    【解决方案1】:

    here 完美地解释了模块的绝对和相对导入以及如何使用它们。 在您的情况下,要在 c 文件夹中不进行相对导入,请使用以下内容创建文件 __init__.py:

    import os, sys
    
    sys.path.append(os.path.dirname(os.path.realpath(__file__)))
    

    那你就可以在script1.py里面离开了

    import script2
    from b.d import script3
    

    并且此导入将在文件夹之外使用

    【讨论】:

    • 您好,感谢您的回答。它解决了我想要的问题 :-) 我应该将该 init.py 文件添加到我项目中的每个包中吗?
    • 谢谢,我很高兴。然后标记为问题的解决方案)该文件应添加到所有存在内部导入的目录中。也就是说,如果 d 目录中出现 script4.py 并且在 script3.py 中您想导入为 import script4 那么您应该将 _init_.py 文件添加到 d 目录
    • 太棒了 :-) 谢谢你的帮助
    猜你喜欢
    • 2022-11-05
    • 1970-01-01
    • 2021-12-17
    • 2021-07-29
    • 2020-05-08
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多