------------------------------------------------------
目的:主要介绍init.py 的作用、如何导入包、以及如何添加python解释器的默认搜索路径。
方法:init.py 的作用是将一个文件夹“变成一个包”。导入包可以通过import package。修改搜索路径可以在sys.path中添加搜索路径,或者在site-packages 下的mypkpath.pth中添加需要的路径即可。
------------------------------------------------------
【1】init.py的作用
(1)如果包的目录下没有这个文件,就是一个普通的文件夹。
(2)在import 包时,包下的init.py会自动执行,所以在init.py下可以添加更多的包。
例如下图中,package文件夹下有init.py这个文件,在里面导入了很多和包。
在a.py里就可以只import a.py,就相当于把 re sys os 都导入了
(3)就是可以用__all__这个变量,然后就可以import *
【2】为了修改搜索路径,方法1---修改 sys.path(这种方法应该是只在当前文件下有效)
(1)Python 解析器,import 时,会依次在下面这些地方进行搜索导入的内容:
- 程序的根目录(自动)
- PYTHONPATH环境变量设置的目录
- 标准库的目录(自动)
- 任何能够找到的.pth文件的内容
- 第三方扩展的site-package目录(自动)
这些路径保存在system 模块的 sys.path 变量中。
例如:执行
>>> import sys
>>> print("\n".join(sys.path))
F:\ProgramData\Anaconda3\python37.zip
F:\ProgramData\Anaconda3\DLLs
F:\ProgramData\Anaconda3\lib
F:\ProgramData\Anaconda3
F:\ProgramData\Anaconda3\lib\site-packages
F:\ProgramData\Anaconda3\lib\site-packages\win32
F:\ProgramData\Anaconda3\lib\site-packages\win32\lib
F:\ProgramData\Anaconda3\lib\site-packages\Pythonwin
(2)在sys.path中添加搜索路径,可以看到在最后添加了一个新的搜索路径。
输入以下代码:
输入以下代码:
import sys
print("\n--------------------")
print("\n".join(sys.path))
print("\n--------------------")
cur_path = os.path.abspath(os.path.dirname(__file__))#获取当前路径
sys.path.append(cur_path+"111")#把当前路径添加到path里
print("\n".join(sys.path))
输出如下:
--------------------
H:\files\0003-program\ps3\ps3\test\esat\scripts
H:\files\0003-program\ps3
F:\ProgramData\Anaconda3\python37.zip
F:\ProgramData\Anaconda3\DLLs
F:\ProgramData\Anaconda3\lib
F:\ProgramData\Anaconda3
F:\ProgramData\Anaconda3\lib\site-packages
F:\ProgramData\Anaconda3\lib\site-packages\win32
F:\ProgramData\Anaconda3\lib\site-packages\win32\lib
F:\ProgramData\Anaconda3\lib\site-packages\Pythonwin
--------------------
H:\files\0003-program\ps3\ps3\test\esat\scripts
H:\files\0003-program\ps3
F:\ProgramData\Anaconda3\python37.zip
F:\ProgramData\Anaconda3\DLLs
F:\ProgramData\Anaconda3\lib
F:\ProgramData\Anaconda3
F:\ProgramData\Anaconda3\lib\site-packages
F:\ProgramData\Anaconda3\lib\site-packages\win32
F:\ProgramData\Anaconda3\lib\site-packages\win32\lib
F:\ProgramData\Anaconda3\lib\site-packages\Pythonwin
H:\files\0003-program\ps3\ps3\test\esat\scripts111
结果:从上面绿色字处可以看出,相比分割线前部分,最后一样添加了需要的路径
(3)如果需要将上级目录添加上一层为到搜索路径里,可以通过:
import os
import sys
cur_path = os.path.abspath(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#添加上上层到搜索路径。
sys.path.append(cur_path)
print("\n".join(sys.path))
【3】方法2---修改site-packages方法,这种方法比较靠谱!!
在site-packages添加一个路径文件,如mypkpath.pth,
必须以.pth为后缀,写上你要加入的模块文件所在的目录名称就是了。
例如windows 下
c:\python27\site-packages D:\ProgramData\Anaconda3\Lib\site-packages
-------------------------------------------------------------------------------------------------------------------------------
【4】这个搜索路径和环境变量不太一样,可以实际输出看一下。
环境变量的输出方法:
import os
# Access all environment variables
print('*---------------ENVIRON-------------------*')
print(os.environ)
print('*----------------HOME------------------*')
# Access a particular environment variable
print(os.environ['HOME'])
print('*--------------PATH--------------------*')
print(os.environ['PATH'])
print('*----------------------------------*')
-------------------------------------------------------------------------------------------------------------------------------------
总结:添加搜索路径
- 如果 .py文件和需要导入的包package在同一个文件夹下,可以在package里添加一个__init__.py (可为空) 文件。
- 如果 .py文件和需要导入的包package不在同一个目录下,package在.py的上一目录,可以通过os.path.abspath(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 这种方法添加上一层路径到搜索路径。
- 在实际运用中,如果是为了在一个文件夹下去调用另一个文件夹下的文件,这种情况下,两个文件夹可能不在同级目录。建议将路径添加到site-packages中。
即:同级目录可以直接import package即可;不同级目录需要执行需要添加os.path,或者site-packages添加mypkpath.pth。
===================================================================
下面时关于import package 的一个例子
import __init__.py 所在的文件夹 时候,会自动执行__init__.py里的内容。
【1】目录图所示,
seven下有t文件夹与a.py
a下有__init__.py
【2】__init__.py
__init__.py 下可以写一个pirnt()
【3】在a.py
里执行import t 的时候,就会自动执行__init__.py
参考的部分引文
https://zhuanlan.zhihu.com/p/64893308
https://blog.csdn.net/weixin_30763455/article/details/97344201
https://blog.csdn.net/weixin_34184158/article/details/88657357
部分图片有水印,引处参考水印,就不贴链接了。