文章目录
1 init文件夹图标
在PyCharm中,带有__init__.py
这个文件的目录被认为是Python的包目录,与普通目录的图标有不一样的显示。
如下图所示,data目录没有__init__.py
,其图标是个文件夹图标;而model下有_init__.py文件,其图标是一个包。所以__init__.py
是Python中package的标识
2 init.py导入包方式
__init__.py
文件的一个主要作用是将文件夹变为一个Python模块,Python中的每个模块的包中,都有__init__.py
文件。
python在解释包的时候会给本模块下的所有文件建立一个索引放在当前路径下的__init__.py
文件中,如果没有文件索引,即使import了指定的包,解释器还是找不到这个模块下的文件。如果一个文件夹下没有__init__.py
文件,不会被当做一个模块。
2.1 单个导入
# package
# __init__.py
import re
import urllib
import sys
import os
# a.py
import package
print(package.re, package.urllib, package.sys, package.os)
注意这里访问__init__.py
文件中的引用文件,需要加上包名。
2.1 批量引入(定义__all__用来模糊导入)
我们在python中导入一个包时,实际上是导入了它的__init__.py文件,这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。
使用__init__.py
中的重要变量__all__,
将模块全部导入。
# __init__.py
__all__ = ['os', 'sys', 're', 'urllib']
# a.py
from package import *
这就会将注册在__init__.py文件中__all__列表中的模块和包导入到当前文件中来。
3 实例
假设我们的模块包的目录结构如下
- mypackage
- - subpackage_1
- - - test11.py
- - - test12.py
- - subpackage_2
- - - test21.py
- - - test22.py
- - subpackage_3
- - - test31.py
- - - test32.py
直接导入
如果我们使用最直接的导入方式,将整个文件拷贝到工程目录下,然后直接导入:
from mypackage.subpackage_1 import test11
from mypackage.subpackage_1 import test12
from mypackage.subpackage_2 import test21
from mypackage.subpackage_2 import test22
from mypackage.subpackage_3 import test31
from mypackage.subpackage_3 import test32
这样的话,查找的时候也会麻烦,此时__init__.py就起到了简化的作用。
init.py导入
在mypackage/添加__init__.py程序,有三种写入方式。
from mypackage.subpackage_1 import test11
from mypackage import *
from mypackage.subpackage_1 import *
4 其他常见问题
4.1 使用__init__.py文件的优点
①当目录下包含这个文件时,Python会将其当作成包目录,进而可以使用import xx.xx的方式导入目录下的文件或者模块。
②使用__init__.py文件可以控制模块导入时的变量和内容,便于编程者的控制。(简化作用)
4.2 没有__init__.py文件的目录,使用import xx.xx会报错吗?
在较低的版本中(如3.2及以下),没有__init__.py文件的目录不能使用import xx.xx导入相关模块,但是后面的版本可以。
4.3 根据导入模块和主程序不同import方式
(1)如果导入的模块和主程序在同个目录下,直接import就行了
(2)如果导入的模块是在主程序所在目录的子目录下,可以在子目录中增加一个空白的__init__.py文件,该文件使得python解释器将子目录整个也当成一个模块,然后直接通过“import 子目录.模块”导入即可。
(3)如果导入的模块是在主程序所在目录的父目录下,则要通过修改path来解决,有两种方法:
①通过sys.path.append
import sys
sys.path.append('父目录的路径') # ’需要引用模块的地址'
来改变。python解释器就是通过sys.path去的寻找模块的。sys.path是一个列表 list ,它里面包含了已经添加到系统的环境变量路径。
【注意】:这种方法是运行时修改,脚本运行后就会失效。
②直接修改环境变量:在windows中是 “ set 变量=‘路径’ ” 例如:set PYTHONPATH=‘C:\test…’ 查看是否设置成功用echo %PYTHONPATH%,而且进到python解释器中查看sys.path,会发现已经有了新增加的路径了。这 种方式是永久的,一次设置以后一直都有效。在linux中是 “export 变量=‘路径’ “,查看是” echo $变量 "