我看到我要问的问题是一个非常微不足道的问题,并且已经被许多人提出并得到了回答。我已经查看了为问题提供的解决方案,但是我没有看到解决方案在我的情况下工作。
我有以下目录层次结构。
----a
-------__init__.py
--------------aa
------------------aa.py
------------------__init__.py
--------------bb
------------------bb.py
------------------__init__.py
-------a.py
我想做以下事情。
通过查看许多解决方案,我已将__init__.py
文件放在每个文件夹目录中。
我用过:
import imp
foo = imp.load_source('module.name', 'path to the file')
这很有效,但由于路径必须是硬编码的,所以我不确定这在我的情况下是不是一个可行的解决方案
目前我通过添加sys目录的路径来进行导入。我想要一个更有活力的解决方案。
我的项目的文件夹层次结构深入到6-7级子目录,我需要一个解决方案来从级别7导入级别1的模块。
如果有人能指出我所缺少的东西,我会很高兴。
答案 0 :(得分:1)
您申请的入口点是什么?例如,如果从命令行开始aa.py
文件,则不幸运。
" Guido将包中的脚本视为反模式" (被拒绝 PEP-3122)
您的包的入口点应该位于包的根目录中。在您的情况下,它是一个文件a.py
。从那里你可以像往常一样导入一些内部模块:
# contents of a.py
from aa import a
现在关于从您的包中导入。
假设在与aa1.py
相同的目录中还有一个文件aa.py
。要从aa.py
导入,您可以使用相对导入功能
# contents of aa.py
from . import aa1
此处.
表示"位于同一目录"。
其他例子:
# contents of aa.py
from .. import a # here .. means "one level above"
from ..bb import bb # this will import your bb.py module
请注意,如果您直接从命令行运行aa.py
,那么所有导入都将失败!
更新:
上述示例中的 .
和..
不是目录名称。这是python语法,用于表示"相同级别","高于"等等。如果您需要从上面的3个级别导入,您应该写:
from .... import my_module