2013-07-22 56 views
3

knoware一个tonhow-to进口Python modules不是路径,但我还没有遇到过使用Python的__init.py__ VS sys.path.insert。哪种方法更好?是否有任何明显的缺点,如表现?还有一个“Pythonic?”吗?Python的__init__.py VS sys.path.append /插入

我可以想到的一个场景是我有一个程序,用户下载并放在任何目录中,所以我不知道绝对路径(除非我以编程方式获得它)。该文件夹的结构是

working dir 
    __init__.py 
    foo.py 
    src/ 
     my_utils.py 
     __init__.py 

我没有看到使用__init__.py或更改sys.path之间的任何区别。有什么情况可以想到它会在哪里产生变化?

我的问题的第2部分是,为什么你必须做什么能够从子目录导入模块?我对Python相当陌生,所以也许我不明白为什么摆弄路径或创建文件是样板文件。对我而言,这似乎是一种不必要的复杂情况。如果我在当前工作目录中有“dir”,并说“import dir.my_utils”,我不明白为什么我必须列出所有我希望能够在__init__.py中导入的内容。

道歉,如果这是重复的,但我在发布之前做过搜索。

编辑:这里的另一个有用的链接:Automatically call common initialization code without creating __init__.py file

+1

“__init.py__' vs'sys.path.insert'”是什么意思?这些东西在哪些方面可比? –

+0

因此,我可以将\ __ init__.py放在每个文件夹中,所以在foo.py中,我可以说“init src.my_utils”。或者,在foo.py中,我可以说“import sys; sys.path.insert(1,”src“的路径); import my_utils” – liang

+1

这些仍然完全不同。 –

回答

3

_ 初始化 _.py使用Python解释治疗目录作为包。包在避免命名空间冲突方面发挥着重要作用。如果您阅读部分6.4包Python Modules,它有助于防止具有通用名称的目录隐藏稍后在搜索路径中发生的其他有效模块。

因此,软件包机制简化了导入软件包的任务。通过使用init .py,您也可以执行类似于package.subpackage import *的操作,如果我们要继续追加到sys.path(事实上,我们将不得不追加所有可能的模块),那么这将会很困难或繁琐。

至于回答第二个部分,你的问题 - 为什么我们需要做什么治疗目录作为包 - 好,需要有某种方式告诉蟒蛇什么应该被允许进口,什么不应该是。另外,如果您已经在开始时导入了所有必需的模块,并且您需要导入的模块已经存在于PYTHONPATH环境变量中,则不需要将任何内容附加到sys.path中。

希望这个答案对你的查询有一些启发。

+0

谢谢,这确实有很大的帮助。我得到关于命名空间冲突的全部内容,但是指出'package.subpackage import *'作为例子真正为我阐明了它。 – liang

+0

我一直在寻找这个解决方案很长一段时间,但不知道我甚至在寻找什么。我讨厌我的一些程序目录有很多模块的混乱。这可以帮助我组织和清理它,只需在每个目录中添加一个__init __。py。精彩! – jtsmith1287