嘿,我在做一个项目,它有一套分层模块,文件夹结构如下:
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系统路径。这甚至是一个合理的担忧吗?在
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导入就是直接进行的。如果要使用绝对导入,请尝试
如果您想使用相对导入,这取决于您现在是哪个模块。假设您正在编写模块
^{pr2}$module_name.sub_module_a.sub_moduel_a_class_a
,然后尝试请注意,相对导入只支持
from .xx import xx
格式。在谢谢。在
相关问题 更多 >
编程相关推荐