Python 模块化 模块搜索顺序、重复导入、模块加载列表(五)
模块搜索顺序、重复导入、模块加载列表
0x00 模块搜索顺序:
举例:
#test.py
import sys for p in sys.path:
print(p) 运行结果:
C:\python //pycharm环境中的Add content roots to PYTHONPATH
C:\python //脚本所在目录
C:\Users\ihoney\AppData\Local\Programs\Python\Python35\python35.zip //打包,java扎包,避免大量小文件占空间
C:\Users\ihoney\AppData\Local\Programs\Python\Python35\DLLs
C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib
C:\Users\ihoney\AppData\Local\Programs\Python\Python35
C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib\site-packages //第三方包安装路径
C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib\site-packages\win32
C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib\site-packages\win32\lib
C:\Users\ihoney\AppData\Local\Programs\Python\Python35\lib\site-packages\Pythonwin
模块的路径搜索顺序:
程序主目录,脚本所在目录
PYTHONPATH目录,包含python的path路径:标准库目录和第三方包目录
环境变量:命令行敲的字符串,依次在路径中搜索
当import 一个模块时,会依次的在以上路径顺序中查找,找到了就不再往后找了,找不到就导入异常,只搜索指定目录,不递归搜索。
路径可以是字典、zip文件、egg文件(蟒蛇蛋)。
.egg文件,是由setuptools库创建的包,添加了元数据(版本号、依赖项等)的zip文件。下一篇文章介绍。
windows优先搜索".",即当前目录
linux只会从环境变量中的路径中挨个找。
比如,当我们在本地写了一个print.py时,windows下模块搜索顺序优先搜索当前目录,然后才是python的path路径 --> 标准库目录,由于当前目录下自定义了一个print模块,所以可能会导致其它模块print()打印异常
0x01 模块的重复导入:
1)创建以下三个文件:
#test.py
import test1
import test2 #test1.py
print("this is test1 module") #test2.py
print("this is test2 module") 运行test.py的结果:
this is test1 module
this is test2 module
2)修改下test.py:
#test.py
import test1
import test2
import test1 再运行下查看结果:
this is test1 module
this is test2 module
上面我们修改test.py后,导入了两次test1模块,但解释器并没有运行两次,也就是模块不会重复的导入。
3)再修改下test.py和test1.py:
#test.py
import test2
import test1 #test1.py
print("this is test1 module")
import test2 输出结果:
this is test2 module
this is test1 module
这次我们先在test.py中先后导入了test2、test1模块,但从输出结果中看,test1.py中导入的test2模块也没有加载初始化,说明程序入口模块已经导入了某模块时,其它调用的模块也不会重复导入该模块。
4)再修改如下:
#test.py
import test1
print(test1.test2.x) #test1.py
print("this is test1 module")
import test2
print(dir()) #test2.py
print("this is test2 module")
x=444 运行test.py结果:
this is test1 module
this is test2 module
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'test2']
444
这次依然可以通过test1.test2.x的方式访问test2模块中的x属性。
总结:
内存编址
共享物理内存
0x02 模块加载列表:
import sys
print(sys.modules.keys()) //加载的所有模块名 dict_keys(['_codecs_cn', '_imp', 'stat', 'encodings.gbk', 'builtins', 'winreg', '_codecs', '__main__', '_sitebuiltins', '_warnings', 'encodings.latin_1', 'sysconfig', 'genericpath', 'errno', '_multibytecodec', 'encodings.utf_8', 'codecs', 'os', '_weakrefset', '_bootlocale', 'sys', 'os.path', 'encodings.aliases', '_collections_abc', 'encodings', 'ntpath', '_stat', '_frozen_importlib', 'site', 'abc', '_io', '_thread', 'test2', 'encodings.mbcs', 'nt', '_frozen_importlib_external', '_signal', '_weakref', '_locale', 'zipimport', 'io', 'marshal', 'test1'])
其中部分模块及模块指向的位置:
'__main__': <module '__main__' from 'C:/python/test.py'>,
os.path <module 'ntpath' from 'C:\\Users\\ihoney\\AppData\\Local\\Programs\\Python\\Python35\\lib\\ntpath.py'>
sysconfig <module 'sysconfig' from 'C:\\Users\\ihoney\\AppData\\Local\\Programs\\Python\\Python35\\lib\\sysconfig.py'>
sys <module 'sys' (built-in)>
os <module 'os' from 'C:\\Users\\ihoney\\AppData\\Local\\Programs\\Python\\Python35\\lib\\os.py'>
zipimport <module 'zipimport' (built-in)>
test2 <module 'test2' from 'C:\\python\\test2.py'>
....
其中部分模块是导入sys模块时,sys模块调用的模块,其中的'__main__'模块指向的是当前脚本名。
Python 模块化 模块搜索顺序、重复导入、模块加载列表(五)的更多相关文章
- python常有模块:模块、引入语法、两种执行方式、模块搜索顺序
今天主要讲了以下几点:一.模块三问.定义及分类二.import和from的语法三.文件的两种执行方式及搜索顺序四.内置函数 一.模块.import和from的语法 1.什么是模块 模块是一堆功能函 ...
- thinkphp 的两种建构模式 第一种一个单入口里面定义两个模块,前台和后台,函数控制模块必须function.php前台加载前台模块的汉书配置文件,后台加载后台模块的汉书配置文件,公共文件共用。第二种架构模式两个单入口文件,分别生成两个应用定义define。。。函数可以定义配置文件。。。。
thinkphp 的两种建构模式 第一种一个单入口里面定义两个模块,前台和后台,函数控制模块必须function.php前台加载前台模块的汉书配置文件,后台加载后台模块的汉书配置文件,公共文件共用. ...
- 打开一个网站,加载顺序是什么?先加载HTML然后JS然后CSS?还是什么?
HTML页面加载和解析流程 : 1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件. 2. 浏览器开始载入html代码,发现<head& ...
- Springboot学习01- 配置文件加载优先顺序和本地配置加载
Springboot学习01-配置文件加载优先顺序和本地配置加载 1-项目内部配置文件加载优先顺序 spring boot 启动会扫描以下位置的application.properties或者appl ...
- Python 3基础教程20-Python中导入模块和包
本文介绍Python中导入模块和包 #目录: # 导入模块和包--- # | # 上级包.上级模块.导入模块和包的init模块----- # | # 同级包.同级模块.上级包的init模块.test模 ...
- 【Python】【Head First Python】【chapter1】1 - 导入模块
导入模块 导入模块有三种方法,以导入sys模块为例: 第一是import module 形式导入 import sys location = sys.stdout 第二是from module imp ...
- linux显示git commit id,同时解决insmod模块时版本不一致导致无法加载问题
linux内核默认会包含git的commit ID. 而linux的内核在insmod模块时,会对模块和内核本身的版本做严格的校验.在开发产品时,改动内核后,由于commit ID变更,会导致linu ...
- 优雅的写好Vue项目代码 — 路由拆分、Vuex模块拆分、element按需加载
目录 路由的拆分 VUEX模块拆分 Element UI库按需加载的优雅写法 路由的拆分 项目较大路由较多时,路由拆分是一个不错的代码优化方案,按不同业务分为多个模块,结构清晰便于统一管理. requ ...
- 跟着太白老师学python day10 名称空间,作用域和取值顺序,变量的加载顺序
名称空间分为3种: 1. 全局名称空间 2. 内置名称空间 3. 局部名称空间(临时) 作用域 全局作用域 1全局名称空间 2 内置名称空间 局部作用域 ...
随机推荐
- Linux安装之后需要进行的一些步骤
查看IP 首先安装后需要查看ip用SSH或者XSHELL来连接Linux,查看ip代码 ifconfig 需要执行 sudo yum install net-tools 命令安装之后 就可以看到ip了 ...
- groovy函数、字符串、循环
三重单引号字符串 '''a triple single quoted string''' 三重单引号字符串是普通的java.lang.String 三重单引号字符串是多行的.您可以跨越行边界跨越字符串 ...
- 【SSH网上商城项目实战19】订单信息的级联入库以及页面的缓存问题
转自: https://blog.csdn.net/eson_15/article/details/51433247 购物车这一块还剩最后两个问题,就是订单信息的级联入库和页面缓存,这里的 ...
- Java 时区转换(UTC+8 到 UTC 等等)
前言:需要做时区转换,知道北京为UTC+8,东京为UTC+9,世界标准时间为UTC,所以下面的代码是只需要知道时区是+8还是+9还是0就可以了,不需要使用"CTT". " ...
- js-js的语句
- Java里面的语句: ** if判断 *** =:表示赋值 *** ==:表示判断 ** switch语句 ** 循环 for while do-while - js里面的也是这些语句 ** if ...
- 牛客Wannafly挑战赛11E 白兔的刁难
传送门 如果大力推单位根反演就可以获得一个 \(k^2logn\) 的好方法 \[ans_{t}=\frac{1}{k}\sum_{i=0}^{k-1}(w_k^{-t})^i(w_k^i+1)^n\ ...
- BZOJ1266 [AHOI2006]上学路线
Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可: ...
- ZJOI2012 网络——LCT相关题目
有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这个图上,你 ...
- .NET AOP微型框架发布 --CleanAOP
CleanAOP--简介 作者:立地(欧文) 邮箱:jarvin_g@126.com 导语: AOP为Aspect Oriented Programming的缩写. 意为:面向切面编程.将日志记录,性 ...
- ubuntu 14.04/14.10 iptables 防火墙设置
1. 一键批处理设置 [plain] view plaincopyprint? #!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/loc ...