在Python和__init__.py中导入模块

j2datikz  于 2023-01-19  发布在  Python
关注(0)|答案(4)|浏览(168)

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

ar7v8xwq

ar7v8xwq1#

__init__.py将一个文件夹转换为一个包,这对于创建模块的层次结构很有用,在模块层次结构中可以使用如下的import语句:

import mymodule.cool.stuff

如果没有软件包,这是不可能的。

xfb7svmp

xfb7svmp2#

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

import package-name.module-name

包也可以嵌套,而且经常是嵌套的。在Python软件目录下的Lib目录中可以找到很多例子。

nnvyjq4y

nnvyjq4y3#

有_init_.py在模块目录中没有的区别是:

当您__init__.py(空白)时,您可以使用导入模块

from dirname import MyModule

但是当您根本没有init.py时,如果不将该模块的路径添加到PYTHONPATH中,就无法导入该模块。在这种情况下,from dirname import MyModuleFAILS,或者报告错误。

#没有_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,来自目录导入模块语句-不工作

[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]#

#否_ 初始化 _.py,导入语句-不工作

[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中插入路径,插入路径后导入模块语句- 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,从目录导入模块语句- 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,没有插入路径,导入模块语句-不起作用

[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

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

8ftvxx2r

8ftvxx2r4#

是的,这是可行的,正如你所知道的,空__init__.py文件的原因是将子文件夹标记为包含模块的文件夹。
因此PYTHONPATH中的文件夹可以包含模块,但是这些文件夹的任何子文件夹必须包含__init__.py文件,才能从其中导入模块。

相关问题