Python __init__.py vs sys.path.appendinsert

问题描述 投票:7回答:1

I 知道 那里 a 攻略 输入 Python模块 不在路径中,但我还没有遇到过使用Python的 __init.py__ vs sys.path.insert。哪种方法更好?这两种方法有什么明显的缺点吗,比如性能?一个更 "Pythonic "吗?

我能想到的一种情况是,我有一个程序,用户下载后放在什么目录下,就放什么目录下,所以我不知道绝对路径(除非我从程序上得到)。文件夹的结构是

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 中列出所有我希望能够导入的东西。

如果这是个重复的问题,我表示歉意,但我在发帖之前已经搜索过了。

编辑:这里有另一个有用的链接:_init_.py 这里有另一个有用的链接。无需创建__init__.py文件就能自动调用普通初始化代码。

python python-2.7 coding-style
1个回答
4
投票

__init__.py 被 python 解释器用来把目录当作包。包在避免命名空间碰撞方面起着重要作用。如果你阅读了 6.4 包件Python模块它有助于防止具有共同名称的目录隐藏搜索路径中后来出现的其他有效模块。

因此,包机制简化了导入包的任务。通过使用一个 __init__.py 你也可以做一些像从 package.subpackage import * 如果我们要不断地追加到 "我 "的名字上,那就很难或很乏味了。sys.path (事实上,我们将不得不附加所有可能的模块)。

至于您问题的第二部分 - 为什么我们需要做任何事情来将目录作为包来处理 - 好吧,需要有一个 某种程度上 来告诉 python 哪些模块可以导入,哪些不可以。另外,如果你一开始就导入了所有需要的模块,并且你需要导入的模块已经存在于sys.path中,那么你不需要在sys.path中明确添加任何内容。PYTHONPATH 环境变量。

希望这个答案能对你的疑问有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.