我一直在阅读有关__init__.py
文件的功能。据说我们在包含模块的文件夹中需要一个空的__init__.py
文件,以便可以导入这些模块。但是,我尝试添加一个文件夹路径到PYTHONPATH(Windows 7中的环境变量)。尽管此文件夹不包含__init__.py
文件,但我仍然可以从该文件夹导入模块。你能否解释一下如何在不存在__init__.py
的情况下导入这些模块?在Python和__init__.py中导入模块
感谢,
问候
我一直在阅读有关__init__.py
文件的功能。据说我们在包含模块的文件夹中需要一个空的__init__.py
文件,以便可以导入这些模块。但是,我尝试添加一个文件夹路径到PYTHONPATH(Windows 7中的环境变量)。尽管此文件夹不包含__init__.py
文件,但我仍然可以从该文件夹导入模块。你能否解释一下如何在不存在__init__.py
的情况下导入这些模块?在Python和__init__.py中导入模块
感谢,
问候
如果目录(文件夹)包含__init__.py
文件,则它将变为包。正如你发现的那样,你认为你阅读的内容并不完全正确。软件包可以像导入模块一样导入,并且__init__.py
中的任何代码都可以运行,但它通常是空的。包是多个模块组合在一起的一种方式,你可以使用加载它们:
import package-name.module-name
包也可以嵌套,而且往往是。在很多示例中查看Python软件目录下的Lib目录。
是的,这个工作,你可以告诉。为空的__init__.py
文件的原因是将子文件夹标记为包含模块的文件夹。
因此,PYTHONPATH中的文件夹可以包含模块,但是这些文件夹的任何子文件夹都必须具有__init__.py
文件才能够从中导入模块。
'__init __。py'不*为*为空。 – 2011-05-06 11:09:36
@Ignacio:如果它的唯一任务是将文件夹标记为具有模块,则它也不需要有任何东西。 OP提到了空的'__init __。py'文件。 – quamrana 2011-05-06 11:17:21
有_ 初始化 _.py和没有一个在你的模块目录之间的区别是:
当你有__init__.py
(空白),你可以使用导入模块
from dirname import MyModule
但是当你不要有 _ 的init _.py完全不能导入模块,直到将模块添加到PYTHONPATH为止。 在这种情况下,from dirname import MyModule
失败,或者报告错误。
#目录结构/ Module _ init _。PY
[[email protected] python]# cd NoInitModule/
[[email protected] NoInitModule]# pwd
/python/NoInitModule
[[email protected] NoInitModule]# ls -l
total 4
-rw-r--r--. 1 root root 44 Jan 16 07:02 ModuleX.py
#与_ INIT _.py
[[email protected] NoInitModule]# cd ../InitModule/
[[email protected] 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
[[email protected] InitModule]#
实例目录/模块的结构:
#NO _ INIT _.py ,从目录导入模块语句 - 不工作
[[email protected] python]# cat impomod.py
from NoInitModule import ModuleX
ModuleX.printBye()
[[email protected] 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
[[email protected] python]#
#NO _ 初始化 _.py,import语句 - 不会没有工作
[[email protected] python]# vim impomod.py
[[email protected] python]# cat impomod.py
#from NoInitModule import ModuleX
import ModuleX
ModuleX.printBye()
[[email protected] python]# python impomod.py
Traceback (most recent call last):
File "impomod.py", line 8, in <module>
import ModuleX
ImportError: No module named ModuleX
[[email protected] python]#
#_ 初始化 _.py,在PYTHONPATH INSERT路径,插入路径后导入模块语句 - WORKS
[[email protected] python]# vim impomod.py
[[email protected] python]# cat impomod.py
import sys
sys.path.append('/python/NoInitModule')
print sys.path
import ModuleX
ModuleX.printBye()
[[email protected] python]# python impomod.py
Bye from Module X with no __init__.py
[[email protected] python]#
#HAVING _ 初始化 _.py,路径的不INSERT,从目录导入模块声明 - 工程
[[email protected] python]# cat impXmod.py
import sys
from InitModule import ModuleY
ModuleY.printSeeU()
[[email protected] python]#
[[email protected] python]# python impXmod.py
See you from Module Y having __init__.py
#HAVING _ 初始化 _.py,路径的不INSERT,进口模块声明 - 不工作
[[email protected] python]# vim impXmod.py
[[email protected] python]# cat impXmod.py
import sys
#from InitModule import ModuleY
import ModuleY
ModuleY.printSeeU()
[[email protected] python]# python impXmod.py
Traceback (most recent call last):
File "impXmod.py", line 3, in <module>
import ModuleY
ImportError: No module named ModuleY
Ofcourse,子文件夹的问题可以被添加到该
好吧,假设有一个文件夹:“A”。而“A”有一个'__init __。py'。但是“A”不在PYTHONPATH中。我可以从“A”文件夹导入模块吗? Python是否会搜索我的计算机中的所有文件夹,以确定它们中是否有“__init __。py”?我的意思是python如何知道“A”的路径? – alwbtc 2011-05-06 11:11:35
@steve:您仍然需要将包的路径添加到您的'PYTHONPATH'中。 Python不会搜索整个计算机中包含“__init __。py”的文件夹。 – 2011-05-06 11:15:44