我看到我要问的问题是一个非常微不足道的问题,已经被很多人问过并因此得到了回答。我已经查看了为该问题提供的解决方案,但我没有看到适用于我的情况的解决方案。
我有以下目录层次结构。
----a
-------__init__.py
--------------aa
------------------aa.py
------------------__init__.py
--------------bb
------------------bb.py
------------------__init__.py
-------a.py
我想做以下事情。
- 从文件a.py中导入bb.py和aa.py--通过在每个文件夹目录中使用__init__.py来完成
- 从 aa.py 导入 bb.py(不起作用)
- 从 aa.py 导入 a.py(不起作用)
通过查看许多解决方案,我将 __init__.py
文件放在每个文件夹目录中。
我用过:
import imp
foo = imp.load_source('module.name', 'path to the file')
这行得通,但由于必须对路径进行硬编码,所以我不确定这对我来说是否是一个可行的解决方案
目前我正在通过将路径添加到 sys 目录来进行导入。我想要一个更动态的解决方案。
我的项目的文件夹层次结构深入到 6-7 级子目录,我需要一个解决方案来从第 7 级导入第 1 级的模块。
如果有人能指出我遗漏了什么,我会很高兴。
最佳答案
您的应用程序的入口点是什么?例如,如果您从命令行启动 aa.py
文件,那您就不走运了。
“Guido 认为在包中运行脚本是一种反模式”(拒绝 PEP-3122 )
包的入口点应该在包的根目录中。在您的例子中,它是一个文件 a.py
。从那里你像往常一样导入一些内部模块:
# contents of a.py
from aa import a
现在关于从你的包中导入。
假设在与aa.py
相同的目录中还有一个文件aa1.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
关于python - 从不同文件夹导入 Python 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37435162/