问题
当第二次导入来自文件夹外部时,我很难找到一种很好的方法来导入链中的模块。更清楚的是,这是我的文件夹组织:
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
答案 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;
目录中,这样就不会误认为是包模块。