用Python和__init__.py导入模块

时间:2011-05-06 10:58:20

标签: python module import

我一直在阅读__init__.py文件的功能。据说我们需要在包含模块的文件夹中有一个空的__init__.py文件,以便可以导入这些模块。但是,我尝试将文件夹路径添加到PYTHONPATH(Windows 7中的环境变量)。虽然此文件夹不包含__init__.py文件,但我仍然可以从该文件夹导入模块。您能解释一下如何在不存在__init__.py的情况下导入这些模块吗?

谢谢,

祝你好运

4 个答案:

答案 0 :(得分:18)

__init__.py将文件夹转换为package。这对于创建一种模块层次结构非常有用,您可以在其中使用如下导入语句:

import mymodule.cool.stuff

如果没有套餐,这是不可能的。

答案 1 :(得分:9)

如果目录(文件夹)包含__init__.py文件,则它将成为。正如你所发现的,你认为你读到的内容并不完全正确。可以导入包,就像它本身就是一个模块一样,__init__.py中的任何代码都会运行,尽管它通常是空的。包是一种将多个模块组合在一起的方法,您可以使用以下方法加载它们:

import package-name.module-name

包也可以嵌套,通常也是。查看Python软件目录下的Lib目录中的许多示例。

答案 2 :(得分:9)

模块目录中拥有_ 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]#

<强>示例:

#NO _ init _。py,来自dir导入模块声明 - 不工作

[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, in <module>
    from 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, in <module>
    import 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导入模块语句 - 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, in <module>
    import ModuleY
ImportError: No module named ModuleY

当然,子文件夹问题可以添加到此

答案 3 :(得分:6)

是的,正如你所知道的,这是有效的。空__init__.py文件的原因是将子文件夹标记为包含模块的文件夹。

因此,PYTHONPATH中的文件夹可以包含模块,但是这些文件夹的任何子文件夹都必须包含__init__.py文件才能从中导入模块。