087-python 中的搜索路径

------------------------------------------------------

目的:主要介绍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 都导入了

d0996a4c69cf05e583a73e1c6bd8fac.png

(3)就是可以用__all__这个变量,然后就可以import *

93a8ccb0c195c664d36f02b40372b1f.png

【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('*----------------------------------*')

-------------------------------------------------------------------------------------------------------------------------------------

总结:添加搜索路径

  1. 如果  .py文件和需要导入的包package在同一个文件夹下,可以在package里添加一个__init__.py (可为空) 文件。
  2. 如果  .py文件和需要导入的包package不在同一个目录下,package在.py的上一目录,可以通过os.path.abspath(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))   这种方法添加上一层路径到搜索路径。
  3. 在实际运用中,如果是为了在一个文件夹下去调用另一个文件夹下的文件,这种情况下,两个文件夹可能不在同级目录。建议将路径添加到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

部分图片有水印,引处参考水印,就不贴链接了。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值