__init__.py在Python源目录中用于什么?
当前回答
__init__.py有两个主要原因
为了方便:其他用户不需要知道您的函数在包层次结构(文档)中的确切位置。您的程序包(_P)/__初始__.py文件1.py文件2.py...文件N.py#在__init__.py中从.file1导入*从.file2导入*...从.fileN导入*#在file1.py中def add():通过然后其他人可以调用add()从您的_package导入添加不知道file1的内部函数,例如从您的_package.file1导入添加如果你想初始化一些东西;例如,日志记录(应该放在顶层):导入logging.configlogging.config.dictConfig(Your_logging_config)
其他回答
__init__.py文件使Python将包含它的目录视为模块。
此外,这是模块中要加载的第一个文件,因此您可以使用它来执行每次加载模块时要运行的代码,或者指定要导出的子模块。
它有助于导入其他python文件。当您将此文件放置在包含其他py文件的目录(比如stuff)中时,可以执行类似importstuff.other的操作。
root\
stuff\
other.py
morestuff\
another.py
如果在目录中没有这个__init__.py,您就无法导入other.py,因为Python不知道这些东西的源代码在哪里,也无法将其识别为一个包。
尽管Python在没有__init__.py文件的情况下工作,但仍应包含一个。
它指定目录应被视为一个包,因此包含它(即使它是空的)。
还有一种情况是,您可能实际使用__init__.py文件:
假设您具有以下文件结构:
main_methods
|- methods.py
而methods.py包含以下内容:
def foo():
return 'foo'
要使用foo(),您需要以下选项之一:
from main_methods.methods import foo # Call with foo()
from main_methods import methods # Call with methods.foo()
import main_methods.methods # Call with main_methods.methods.foo()
也许您需要(或希望)将methods.py保存在main_methods(例如运行时/依赖项)中,但您只希望导入main_method。
如果将methods.py的名称更改为__init__.py,则可以通过导入main_methods来使用foo():
import main_methods
print(main_methods.foo()) # Prints 'foo'
这是因为__init__.py被视为包的一部分。
一些Python包实际上做到了这一点。一个例子是JSON,其中运行import JSON实际上是从JSON包中导入__init__.py(请参阅此处的包文件结构):
源代码:Lib/json/__init__.py
如果您使用的是Python 2,并且希望加载文件的同级文件,那么只需将文件的父文件夹添加到会话的系统路径中即可。它的行为与当前文件是init文件的情况大致相同。
import os
import sys
dir_path = os.path.dirname(__file__)
sys.path.insert(0, dir_path)
之后,相对于文件目录的常规导入将正常工作。例如。
import cheese
from vehicle_parts import *
# etc.
一般来说,您希望使用一个合适的init.py文件,但在处理遗留代码时,您可能会遇到f.ex.一个硬编码的库来加载特定文件,而不是其他文件。对于这些情况,这是一种选择。
__init__.py将其所在的目录视为可加载模块。
对于喜欢阅读代码的人,我将二位炼金术士的评论放在这里。
$ find /tmp/mydir/
/tmp/mydir/
/tmp/mydir//spam
/tmp/mydir//spam/__init__.py
/tmp/mydir//spam/module.py
$ cd ~
$ python
>>> import sys
>>> sys.path.insert(0, '/tmp/mydir')
>>> from spam import module
>>> module.myfun(3)
9
>>> exit()
$
$ rm /tmp/mydir/spam/__init__.py*
$
$ python
>>> import sys
>>> sys.path.insert(0, '/tmp/mydir')
>>> from spam import module
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named spam
>>>
推荐文章
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- django MultiValueDictKeyError错误,我如何处理它
- 如何在for循环期间修改列表条目?
- 我如何在Django中创建一个鼻涕虫?
- 没有名为'django.core.urlresolvers'的模块
- 蟒蛇导出环境文件
- Django - makemigrations -未检测到任何更改
- SQLAlchemy:引擎、连接和会话差异
- 在Python Pandas中删除多个列中的所有重复行
- 更改pandas DataFrame中的特定列名
- 将Pandas多索引转换为列
- 熊猫在每组中获得最高的n个记录
- 熊猫数据帧得到每组的第一行