我一直在阅读__init__.py
文件的功能.据说我们需要__init__.py
在包含模块的文件夹中有一个空文件,以便可以导入这些模块.但是,我尝试将文件夹路径添加到PYTHONPATH(Windows 7中的环境变量).虽然此文件夹不包含__init__.py
文件,但我仍然可以从该文件夹导入模块.你能解释一下如何在没有存在的情况下导入这些模块__init__.py
吗?
谢谢,
最好的祝福
__init__.py
将文件夹转换为包.这对于创建一种模块层次结构非常有用,您可以在其中使用如下导入语句:
import mymodule.cool.stuff
没有包,这是不可能的.
如果目录(文件夹)包含__init__.py
文件,则它将成为包.正如你所发现的,你认为你读到的内容并不完全正确.一个包可以像它自己一样导入模块,并且__init__.py
运行任何代码,尽管它通常是空的.包是一种将多个模块组合在一起的方法,您可以使用以下方法加载它们:
import package-name.module-name
包也可以嵌套,通常也是.查看Python软件目录下的Lib目录中的许多示例.
_ init _.py与模块目录中没有_之间的区别是:
如果有 __init__.py
(空白),则可以使用导入模块
from dirname import MyModule
但是当你根本没有 _ init _.py时,如果不将该模块添加到PYTHONPATH,则无法导入模块.在这种情况下 from dirname import MyModule
FAILS,或报告错误.
#目录/模块的结构没有_ init _.py
[root@Machine python]# cd NoInitModule/ [root@Machine NoInitModule]# pwd /python/NoInitModule [root@Machine NoInitModule]# ls -l total 4 -rw-r--r--. 1 root root 44 Jan 16 07:02 ModuleX.py
#目录/模块的结构_ init _.py
[root@Machine NoInitModule]# cd ../InitModule/ [root@Machine InitModule]# ls -l total 4 -rw-r--r--. 1 root root 0 Jan 16 07:13 __init__.py -rw-r--r--. 1 root root 49 Jan 16 07:12 ModuleY.py [root@Machine InitModule]#
例子:
#al _ init _.py,来自dir import module语句 - 不工作
[root@Machine python]# cat impomod.py from NoInitModule import ModuleX ModuleX.printBye() [root@Machine python]# python impomod.py Traceback (most recent call last): File "impomod.py", line 7, infrom NoInitModule import ModuleX ImportError: No module named NoInitModule [root@Machine python]#
#NO _ init _.py,import语句 - 不起作用
[root@Machine python]# vim impomod.py [root@Machine python]# cat impomod.py #from NoInitModule import ModuleX import ModuleX ModuleX.printBye() [root@Machine python]# python impomod.py Traceback (most recent call last): File "impomod.py", line 8, inimport ModuleX ImportError: No module named ModuleX [root@Machine python]#
#NO _ init _.py,PYTHONPATH中的INSERT路径,插入路径后导入模块语句 - WORKS
[root@Machine python]# vim impomod.py [root@Machine python]# cat impomod.py import sys sys.path.append('/python/NoInitModule') print sys.path import ModuleX ModuleX.printBye() [root@Machine python]# python impomod.py Bye from Module X with no __init__.py [root@Machine python]#
#HAVING _ init _.py,没有INSERT的路径,来自dir import module语句 - WORKS
[root@Machine python]# cat impXmod.py import sys from InitModule import ModuleY ModuleY.printSeeU() [root@Machine python]# [root@Machine python]# python impXmod.py See you from Module Y having __init__.py
#HAVING _ init _.py,没有INSERT路径,导入模块语句 - 不工作
[root@Machine python]# vim impXmod.py [root@Machine python]# cat impXmod.py import sys #from InitModule import ModuleY import ModuleY ModuleY.printSeeU() [root@Machine python]# python impXmod.py Traceback (most recent call last): File "impXmod.py", line 3, inimport ModuleY ImportError: No module named ModuleY
当然,子文件夹问题可以添加到此
是的,正如你所知道的,这是有效的.空__init__.py
文件的原因是将子文件夹标记为包含模块的文件夹.
所以PYTHONPATH中的文件夹可以包含模块,但是这些文件夹的任何子文件夹都必须有一个__init__.py
文件才能从中导入模块.