从不同的文件夹导入Python模块

时间:2016-05-25 11:02:32

标签: 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(不起作用)
  4. 通过查看许多解决方案,我已将__init__.py文件放在每个文件夹目录中。

    我用过:

    import imp
    
    foo = imp.load_source('module.name', 'path to the file') 
    

    这很有效,但由于路径必须是硬编码的,所以我不确定这在我的情况下是不是一个可行的解决方案

    目前我通过添加sys目录的路径来进行导入。我想要一个更有活力的解决方案。

    我的项目的文件夹层次结构深入到6-7级子目录,我需要一个解决方案来从级别7导入级别1的模块。

    如果有人能指出我所缺少的东西,我会很高兴。

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
相关问题