在Python中导入链:从外部导入两个相关文件

时间:2017-05-01 18:00:00

标签: python python-3.x import

问题

当第二次导入来自文件夹外部时,我很难找到一种很好的方法来导入链中的模块。更清楚的是,这是我的文件夹组织:

main/                          
    __init__.py              
    a/                  
        __init__.py
        foo.py
        bar.py
    b/                  
        __init__.py
        stuff.py

stuff.py - 通常是一大段代码 - 我想做这样的事情:

from a.foo import thing

但在foo.py - 通常是某种类型的库 - 我已经有类似的东西:

from bar import other_thing

当我运行stuff.py时,我遇到导入错误,指出foo.py不知道模块bar。当然,当我单独运行foo.py时,我没有错误。

目前可能的解决方案

一个简单的解决方法是:

from a.bar import other_thing

而不是foo.py。但是必须指定模块a感觉很奇怪,因为两个文件都存在于同一个文件夹中。当您在foo.py中开发某些内容时,您不必关心这一点。

我还可以添加以下内容:

sys.path.insert(1, '../a')

stuff.py中的

。但在stuff.py的情况下,我可以完全忽略模块结构,只需导入:

from foo import thing

也感觉不对。

这纯粹是一个风格问题,但我确信有一个很好的解决方案,可能使用__init__.py文件。我找不到它。任何的想法?

我正在使用Python 3.4

1 个答案:

答案 0 :(得分:1)

您可以在from .bar import other_thing 中使用包相对导入。

stuff.py

有关详细信息,请参阅Intra-Package References

请注意,如果直接运行__main__,则它是顶级脚本(b.stuff),并且不是程序包的成员。如果某个其他模块导入bin,则会获得不同的副本。就个人而言,我将顶级脚本放在不同的create type IncorrectRecord as (pattern_number integer, uoc_number integer); create or replace function text1(pattern text, uoc_threshold integer) returns setof IncorrectRecord as $$ begin return next count(v1.code) as pattern_number, count(v2.code) as uoc_number from (select * from q1_1 where code like pattern) as v1, (select * from q1_1 where code like pattern and uoc > uoc_threshold) as v2; return; end $$ language plpgsql; 目录中,这样就不会误认为是包模块。