Python __init__.py vs sys.path.append / insert

时间:2013-07-22 03:24:29

标签: python python-2.7 coding-style

know are ton how-to导入Python modules不在路径中,但我还没有使用过Python __init.py__ vs vs sys.path.insert。哪种方法更好?是否有任何明显的缺点,如性能?还有一个“Pythonic?”

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

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

我认为使用__init__.py或更改sys.path没有任何区别。有没有什么方案你可以想到它会产生什么影响?

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

如果这是重复的道歉,但我在发布前进行了搜索。

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

1 个答案:

答案 0 :(得分:4)

python解释器使用

_ init _。py 将目录视为包。包在避免命名空间冲突方面起着重要作用。如果您阅读Python Modules中的 6.4 Packages 部分,则有助于防止具有通用名称的目录隐藏稍后在搜索路径中出现的其他有效模块。

因此,包机制简化了导入包的任务。通过使用 init .py,您还可以执行类似于package.subpackage import *的操作,如果我们要继续追加sys.path,那么这将很难或很乏味(实际上我们会必须附加所有可能的模块。)

至于回答你问题的第二部分 - 为什么我们需要做任何事情来将目录视为包 - 好吧,需要某种方式告诉python应该允许导入什么什么不应该。此外,如果您在开头导入了所有必需的模块并且需要导入的模块已经存在于 PYTHONPATH 环境变量中,则无需显式地向sys.path附加任何内容。

希望这个答案可以解释你的疑问。