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

7
我希望有一个层次结构,看起来像这样(必须是这个样子)。
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中这样做:

    import ui_sub_directory.ui

这是UI界面:

    import domain_sub_directory.domain

但UI模块不能看到域模块。
我做错了什么?
顺便问一下,我需要导入我正在使用的类吗?这与以下内容有什么区别:
from x import y 

?

*编辑* 对于那些不理解的人,我想要从以下导入:

folder1 /folder2 /folder3 /module1 

我想要导入这个:

folder1 /folder2 /module2

import ui_sub_directory.ui() 这个语法和逻辑已经是错误的了。 - Gandaro
几乎是这个的副本: https://dev59.com/6Wox5IYBdhLWcg3wzng0 - Johan Lundberg
1
我可能也会问你“苹果和梨有什么区别”,那是一个类似的问题。它们完全不同。第一个是错误的,而第二个则不是。请阅读有关导入的内容 - Gandaro
如果您查看另一个问题链接,您会发现OP确实想要在更高级别中导入脚本。 - jdi
我在你的示例中没有看到UI模块。 - jdi
显示剩余4条评论
1个回答

8

你询问了import语句的区别。这部分取决于导入对象所使用的命名空间,同时也是限制导入代码量的一种方法。

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

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


如果您不想回答,请至少发布一个链接,我不太懂英语,无法搜索相关内容。我已经找到了普通的导入方式,但没有找到“反向”的方法。感谢您至少提供了第二部分的信息。 - Kalec
这些链接已经在评论中发布了。但我更新了一些更多的帮助。 - jdi
好的,抱歉因为有太多简单的问题而打扰你。但是现在我遇到了这个错误:“SyntaxError:(unicode error) 'unicodeescape' codec can't decode bytes in position 13-15: end of string in escape sequence”,我的路径应该是什么样子的呢?D:\Info\Eclipse Workspace\Test\Test_src\ui?还是别的?我不明白。 - Kalec
发表更多的代码。这看起来像是您只是在处理格式不正确的字符串。 - jdi
尝试使用正斜杠或者使用原始字符串,如r'\路径\路径'。 - jdi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接