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

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

我知道有很多不在path中的如何导入python模块,但是我还没有遇到使用python的uuinit.py_uuuvs sys.path.insert的情况。哪种方法更好?两者都有明显的缺点吗,比如性能?还有一个"Python"吗?

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

1
2
3
4
5
6
working dir
    __init__.py
    foo.py
    src/
        my_utils.py
        __init__.py

我看不出使用init和更改sys.path之间有什么区别。你能想到在哪种情况下会有什么不同吗?

我的问题的第2部分是,为什么要做任何事情才能从子目录导入模块?我对python还比较陌生,所以我可能不理解为什么修改路径或创建init文件是样板文件。对我来说,这似乎是一个不必要的复杂问题。如果我在当前的工作目录中有"dir"并说"import dir.my-utils",我不明白为什么我必须列出所有我想在"in i t"py中导入的内容。

抱歉,如果这是一个副本,但我在发布前搜索过。

编辑:这是另一个有用的链接:自动调用通用初始化代码,而不创建uuinit_uuuy文件


_ python解释器使用init_.py将目录视为包。包在避免命名空间冲突方面发挥着重要作用。如果从python模块中读取第6.4节中的包,那么它有助于防止具有公共名称的目录隐藏搜索路径后面出现的其他有效模块。

因此,包机制简化了导入包的任务。通过使用init.py,您还可以从package.subpackage import *中执行一些操作,如果我们继续附加到sys.path中,这将很难或很麻烦(实际上,我们必须附加所有可能的模块)。

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

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