2013-10-15 128 views
0

我在导入子包时遇到问题。包装结构我是:奇怪的Python导入行为

project/ 
    __init__.py 
    defaults.py 
    helpers/ 
     __init__.py 
     misc.py 

我需要各地项目从defaults.py使用数据,包括helpers\misc.py,而在defaults.py我需要使用一些功能从helpers\misc.py。为解决循环引用我想是指一切从项目的根,即内部defaults.py我做

import project 

project.helpers.somefunction() 

然而,这是行不通的。

from project.helpers import somefunction 

somefunction() 

但后来我有一个循环引用的问题:当我直接导入功能,这样它的工作,虽然。 我也有同样的问题在项目子包中的任何地方,但在其他地方,我可以直接导入子包并解决问题。

那么,为什么它工作,如果我从子包中导入,但不是当我从根包引用相同的子包时?

PS:没有像这样的文件与helpers\在同一级别或在里面。

PPS:整个项目包通过sys.path.insert(0, '<project_abs_path>')

加入sys.path PPPS:Python的2.7.3,Ubuntu的12.04

回答

1
import project.helpers 

project.helpers.somefunction() 
+0

能否请您解释一下为什么这会有所帮助? – Daniel

+1

@Ophion当你导入一个包时,**执行** __init __。py'中的代码。期。它没有**导入子包。如果你想自动导入子包,那么你必须在包的'__init __。py'中这样做。包就像任何其他模块一样。唯一的区别是它在文件系统中的布局(使用'name/__ init __。py'而不是'name.py')以及执行相对导入的能力。 – Bakuriu