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

lia*_*ang 7 python coding-style python-2.7

知道如何对导入Python模块不在路径,但我还没有遇到过使用Python的__init.py__ VS sys.path.insert.哪种方法更好?是否有任何明显的缺点,如性能?还有一个"Pythonic?"

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

working dir
    __init__.py
    foo.py
    src/
        my_utils.py
        __init__.py
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑:这是另一个有用的链接:自动调用常见的初始化代码而不创建__init__.py文件

Pra*_*nde 5

__init__.py被 python 解释器用来将目录视为包。包在避免命名空间冲突方面发挥着重要作用。如果您阅读了6.4节来自Python 模块的,它有助于防止具有通用名称的目录隐藏稍后出现在搜索路径中的其他有效模块。

因此,包机制简化了导入包的任务。通过使用 an__init__.py你还可以做一些类似的package.subpackage import *事情,如果我们继续追加到sys.path(实际上我们将不得不追加所有可能的模块),这将是困难或乏味的。

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

希望这个答案能对您的查询有所了解。