python - 从不同文件夹导入 Python 模块

标签 python

我看到我要问的问题是一个非常微不足道的问题,已经被很多人问过并因此得到了回答。我已经查看了为该问题提供的解决方案,但我没有看到适用于我的情况的解决方案。

我有以下目录层次结构。

----a
-------__init__.py
--------------aa
------------------aa.py
------------------__init__.py
--------------bb
------------------bb.py
------------------__init__.py
-------a.py

我想做以下事情。

  1. 从文件a.py中导入bb.py和aa.py--通过在每个文件夹目录中使用__init__.py来完成
  2. 从 aa.py 导入 bb.py(不起作用)
  3. 从 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/

相关文章:

python - (Swagger 2.0/Connexion) None 类型不是 'string' 类型

python - 如何在 python 中编辑请求以添加 TLS 设置?

python - 从 os.system() 命令运行 "piping"脚本

python - 图像模块Python

python - MySQL、RDS、锁定​​超时

Python "a=a-b"和 "a-=b"真的等价吗?

python - tf.gradient 的行为类似于 tfp.math.diag_jacobian

python - 在python中拆分大括号分组的字符串

python - 使用 tensorflow 进行增量模型训练

python - 如何使用 np.sort() 对数组进行排序