具有复杂文件夹层次结构的导入

2024-09-27 22:23:48 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,我在做一个项目,它有一套分层模块,文件夹结构如下:

module_name/
    __init__.py
    constants.py
    utils.py
    class_that_all_submodules_need_access_to.py

    sub_module_a/
        __init__.py
        sub_module_a_class_a.py
        sub_module_a_class_b.py
        useful_for_sub_module_a/
             __init__.py
             useful_class_a.py
             useful_class_b.py

    sub_module_b/
        __init__.py
        sub_module_b_class_a.py
        sub_module_b_class_b.py

等等等等。。。在

问题是,我不知道如何在init.py中设置导入,这样我就可以访问所有子模块都需要访问的类_收件人.py源于sub_module_a/usiver_for_sub_module_a/usivery_class_a.py。在

我试着在Google/StackOverflow上查找这篇文章,但我没有找到答案。奇怪的是,PyCharm的路径设置方式使得我在PyCharm中进行项目时不会遇到这个bug,而是只会遇到其他环境中的bug。在

所以这里有一个特别不雅观的解决方案,我想出了。我的sub-module_a/utility_for_sub_module_a/init.py看起来像:

^{pr2}$

这在sub_module_U*/中是相似的,其中不是3'..而是两个(即“..”、“..”而不是“..”、“..”,对于系统路径插入上面的一行)。然后在sub_module_a/usivery_for_sub_module_a/usivery_class_.py中,我必须导入模块名/常量.py(和其他人)像这样:

import module_name.constants
from module_name.class_that_all_submodules_need_access_to import ImportantClass

我想知道这个解决方案是否能更好地解决导入问题?我担心这个模块的用户会弄乱python系统路径。这甚至是一个合理的担忧吗?在


Tags: 模块项目namepy路径forthatinit
1条回答
网友
1楼 · 发布于 2024-09-27 22:23:48

Python导入有两种:绝对导入和相对导入,请参见Python import。但是第一件重要的事情是,您需要了解python是如何找到您的包的?如果您只是将包放在主文件夹下,那么Python对此一无所知。您可以查看这个博客[Python search](https://leemendelowitz.github.io/blog/how-does-python-find-packages.html)。在

因此,要导入模块,首先要让Python知道您的包。在知道Python搜索包的位置之后,通常有两种方法可以实现此目标:

(1)PYTHONPATH环境变量。在您的环境配置文件中设置此变量,例如.bash_profile。这也是最简单的方法。在

(2)使用setuptools,这可以帮助您分发包。说来话长。我不建议你选择它,除非你想在将来分发你的包裹。然而,这是值得知道的。在

如果您正确地设置了路径,Python导入就是直接进行的。如果要使用绝对导入,请尝试

from module_name import class_that_all_submodules_need_access_to

如果您想使用相对导入,这取决于您现在是哪个模块。假设您正在编写模块module_name.sub_module_a.sub_moduel_a_class_a,然后尝试

^{pr2}$

请注意,相对导入只支持from .xx import xx格式。在

谢谢。在

相关问题 更多 >

    热门问题