【问题标题】:ModuleNotFoundError: No module named, but file nested within moduleModuleNotFoundError:没有命名模块,但文件嵌套在模块中
【发布时间】:2021-12-16 01:25:49
【问题描述】:

我对 Python 中的模块有一个查询。

使用 VSCode 我设置了以下简单代码:

Demo/
    Test.py
    z1/
        \_\_init\_\_.py
        Foo.py
        z2/
            \_\_init\_\_.py
            Screen.py

screen.py 包含:

class Screen:
SCREEN_SIZE = [800, 600]

和 z2/__init__.py

from  z1.z2.Screen import *

以下 Foo.py 和 Test.py 都有:

from z1.z2.Screen import *
print(Screen.SCREEN_SIZE)

为什么当我运行 Test.py 时,我得到了:

[800, 600]

但是当我运行 Foo.py 时,我得到:

File "***\Python\z1\Foo.py", line 1, in <module>
    from z1.z2 import *
ModuleNotFoundError: No module named 'z1'

我可以将 __init__.py 中的 z1.z2 更改为 z2,但 Test.py 不起作用。 有什么办法让它对这两个文件都有效吗?

【问题讨论】:

  • 我认为问题在于我如何设置环境,并且项目目录没有添加到 PYTHONPATH,这就是绝对导入不起作用的原因。

标签: python module nested


【解决方案1】:

我个人不喜欢 Python 的导入系统。运行 Foo.py 时是否可以成功导入使用 from z2.Screen import *

我(不幸的是)也使用以下代码来处理测试代码

try:
    from x.y import z
except ImportError:
    from y import z

但我想您也可以使用os.path 将根路径添加到 Foo.py。在 Foo.py 你可以尝试添加

import sys

sys.path.append('../')

【讨论】:

    【解决方案2】:

    您似乎没有使用虚拟环境,这会导致文件独立运行。

    按原样,您正尝试在Foo.py 中导入z1,但Foo.py 只看到一个名为z2 的子文件夹。将 Foo.py 中的 import 语句更改为 from z2.Screen import * 暂时可以解决问题。

    如果使用虚拟环境,则必须使用import,就好像文件位于主目录中一样。

    作为旁注,this might give some better insight to using _init_.py

    【讨论】:

    • 所以如果我让解释器在我的 Demo 文件夹中查找所有模块,它应该可以工作吗?有没有办法确保 VSCode 始终将项目文件夹视为搜索包/模块的地方,否则除了主项目文件夹中的文件之外,您无法在任何地方使用绝对路径
    • 我试图从项目文件夹中使用绝对导入,我已通过添加到 PYTHONPATH 来修复它。
    猜你喜欢
    • 1970-01-01
    • 2021-09-10
    • 2020-08-15
    • 2019-03-28
    • 2021-08-28
    • 2022-01-07
    • 2020-04-07
    • 1970-01-01
    相关资源
    最近更新 更多