从“平行”子目录中导入另一个目录的模块

7 投票
1 回答
9062 浏览
提问于 2025-04-17 12:23

我想要一个这样的层级结构(必须是这个样子)

main_folder\
    main.py
    domain_sub_directory\
        __init__.py
        domain.py
    ui_sub_direcotory\
        __init__.py
        menu.py

我需要从main.py激活ui.py,然后从menu.py访问domain.py。我该怎么做呢?

在main.py里我这样做了:

    import ui_sub_directory.ui

在ui.py里这样:

    import domain_sub_directory.domain

但是UI模块看不到domain模块。

我哪里做错了呢?

顺便问一下,我需要导入我正在使用的类吗?这和下面的有什么区别:

from x import y 

?

* 编辑 * 对于那些不理解的人,我想从这里导入:

folder1 /folder2 /folder3 /module1 

我想导入这个:

folder1 /folder2 /module2

1 个回答

8

你问的是导入语句之间的区别。这部分是关于你要导入的对象会在哪个命名空间下,以及如何限制导入的代码量。

import os
from os import path

os和os.path都是模块。第一个导入了整个os模块和它的所有子模块。这可能会导入你不需要的内容,对于一些大型库来说,这可能会造成不必要的负担。不过,你仍然可以通过os.path来访问路径功能。

第二种形式是选择性地只导入路径模块。此外,它不再以os命名空间的形式进入你的代码,而是直接作为path在根级别存在。

虽然这个链接 从父目录导入脚本 告诉你所有需要知道的内容,这里还有一些更具体的信息:

# this will make your package available on your pythonpath
sys.path.append("/path/to/main_folder")

这样你的各种脚本可以相对于主文件夹引用其他模块,比如:

from ui_sub_direcotory import menu

from domain_sub_directory import domain

import main

这些都是在你的包内有效的导入。

撰写回答