Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我必须添加一个空白的_init__u;.py文件来从子目录导入_Python - Fatal编程技术网

Python 为什么我必须添加一个空白的_init__u;.py文件来从子目录导入

Python 为什么我必须添加一个空白的_init__u;.py文件来从子目录导入,python,Python,我可以使用一个空白的\uuuu init\uuuu.py文件从子目录导入。那很好。我认为python中的init文件与索引文件类似。但是我真的不明白为什么导入的\uuuu init\uuuu.py文件是空的。\uuuu init\uuuuu.py文件和导入如何真正起作用 文件内容必须是什么?该文件有两个主要功能: 标记包:它将目录标记为Python包,将内部.py文件标记为Python模块 初始化代码:顾名思义,导入包时,\uuuu init\uuuu.py中的任何代码都会自动执行。这是运行特

我可以使用一个空白的
\uuuu init\uuuu.py
文件从子目录导入。那很好。我认为python中的init文件与索引文件类似。但是我真的不明白为什么导入的
\uuuu init\uuuu.py
文件是空的。
\uuuu init\uuuuu.py
文件和导入如何真正起作用


文件内容必须是什么?

该文件有两个主要功能:

  • 标记包:它将目录标记为Python包,将内部
    .py
    文件标记为Python模块

  • 初始化代码:顾名思义,导入包时,
    \uuuu init\uuuu.py
    中的任何代码都会自动执行。这是运行特定包所需的初始化代码的正确位置;但是,完全可以将
    \uuuu init\uuuu.py
    文件保留为空


如果导入的子目录中有
\uuu init\uuuuuuuuuy.py
文件,则该子目录是一个包。您不需要使用包,只需将子目录添加到
sys.path
列表中即可。但是,它们是将相关模块保持在一起的一种简洁方式,通常受到鼓励


\uuuu init\uuuu.py
文件与类中的
\uuuuu init\uuuu
具有类似的用途,它初始化包。这允许为包指定属性,例如
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
(导入的导出名称列表*)

有时不需要初始化,因此可以为空。查找示例的好地方是
Lib
目录的标准库子目录。在那里你会发现巨大的
\uuuu init\uuuuuuuupy
文件和其他空文件


这是否是强制性的取决于Python版本。在Python3.3中,
\uuu init\uu.py
不是必需的,这样的包称为名称空间包,请参阅。这意味着一个包可以跨越目录,但要付出代价。不能有
\uuuuuu init\uuuuuuuuupy
初始化代码,也不能获得包的
\uuuuuuuuuuuuuuuuuuuuuuuu
属性。因此,除非您特别需要跨目录,否则最好还是使用常规软件包。

因为Python规范需要它?这不是重复的吗?谢谢您的回答!那在我的脑海里留下了问号。如果答案正确,别忘了将其标记为已接受,这样其他用户就不会在上面花费时间了。@PeterWood据我所知不是这样。