Python imp模块 实际使用中的坑
关于imp,我开始把他当做了一个简单的import来看
然后我运行下面这段代码,发现了一些奇怪的问题
a.py
A = {"position": "in a"}class Test1(object):@classmethoddef printA(cls):print "I am in a.py"print A
b.py
A = {"position": "in b"}
class Test2(object):@classmethoddef printA(cls):print "I am in b.py"print A
3.py
import impa = imp.load_source("mod", "a.py")
b = imp.load_source("mod", "b.py")
obj1 = a.Test1()
obj2 = b.Test2()
obj1.printA()
obj2.printA()
结果
# python 3.py
I am in a.py
{'position': 'in b'}
I am in b.py
{'position': 'in b'}
我发现模块a.py中的常量A被b.py中的A给覆盖了。。。这个的主要原因是因为没有理解imp.load_source的用法。
官网上是这么写的
imp.
load_source
(name, pathname[, file])Load and initialize a module implemented as a Python source file and return its module object. If the module was already initialized, it will be initialized again. The name argument is used to create or access a module object. The pathname argument points to the source file. The file argument is the source file, open for reading as text, from the beginning. It must currently be a real file object, not a user-defined class emulating a file. Note that if a properly matching byte-compiled file (with suffix
.pyc
or.pyo
) exists, it will be used instead of parsing the given source file.
大概意思就是加载并初始化一个python源文件并且返回模块对象,如果模块已经被初始化,那么调用这个函数的话模块将再次被初始化。说起来有点绕,我们看个例子。
a.py
word = "In a"
class Test1(object):@classmethoddef printA(cls):print "I am in a.py"
b.py
class Test2(object):@classmethoddef printA(cls):print "I am in b.py"
3.py
import impa = imp.load_source("mod", "a.py")
b = imp.load_source("mod", "b.py")
print b.word
print dir(b)
运行python 3.py结果
# python 3.py
In a
['Test1', 'Test2', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'word']
可以看出,b中已经添加了a.py中的word这个属性
其实运行流程是这样的,将a.py载入到名字为mod的模块中,然后再将b.py载入到名为mod的模块中,相当于将两个模块a.py与b.py合并到名字为mod的模块里面
可以按下面这种方式验证
3.py
import imp
import sys
a = imp.load_source("mod1", "a.py")
b = imp.load_source("mod1", "b.py")
print sys.modules
结果,sys.modules里面已经有mod1了
root@qianyuqiao-All-Series:/home/codes# python 3.py | grep mod1
........,'mod1': <module 'mod1' from 'b.pyc'>, ....
Python imp模块 实际使用中的坑相关推荐
- python imp模块
发现imp主要有两种用法 imp.find_module(name[,path]) 如果path为空,则按照sys.path路径搜索模块名, 返回三元组(file, pathname, descrip ...
- python中的imp模块——让引用模块更加简单
最近撸代码的时候发现python有一个imp模块,有点儿意思. 首先: pip install imp 看模块名,可以看出其实就是"import"的缩写.在功能上也一样,但用起来比 ...
- python中time模块中的倒计时_Python中time模块与datetime模块在使用中的不同之处 python 的time模块获取的是什么时间...
python的datetime模块的一些问题 time_1 = datetime.datetime.now(pytz.timezone('Asia/Shanghai')) timeimport dat ...
- python csv 模块的使用
python csv 模块的使用 歌曲推荐:攀登(live) csv 是用逗号分隔符来分隔列与列之间的. 1. csv的写入 1.简单的写入,一次写入一行 import csv with open(& ...
- python哪个关键字可以导入模块_关于python导入模块import与常见的模块详解
0.什么是python模块?干什么的用的? Java中如果使用abs()函数,则需要需要导入Math包,同样python也是封装的,因为python提供的函数太多,所以根据函数的功能将其封装在不同的m ...
- python pp模块_Python模块--Pexpect
探索 Pexpect,第 1 部分:剖析 Pexpect 概述 Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输 ...
- Python copy模块浅拷贝和深拷贝
Python copy模块浅拷贝和深拷贝 在开发中,经常涉及到数据的传递,在数据传递使用的过程中,可能会对数据进行修改. 对数据进行处理后,如果在后面的代码中,即需要使用修改之前的数据,也需要使用修改 ...
- Python crypto模块实现RSA和AES加密解密
Python crypto模块实现RSA和AES加密解密 Python的crypto是用于RSA加密解密,AES加密解密的. 一.RSA和AES简介 RSA加密算法是一种非对称加密算法.RSA 是19 ...
- Python常用模块集锦
常用模块主要分为以下几类(缺失的后续再补充): 时间转换 时间计算 序列化和反序列化:json,pickle 编解码:unicode,base64 加解密:md5,sha1,hmac_sha1,aes ...
最新文章
- 6种常见的Git错误以及解决的办法
- vue用户行为收集_vue 实现移动端键盘搜索事件监听
- IOC和DI是什么?
- mysql_contents_将MySQLhelpcontents的内容有层次的输出方法推荐
- mybatis学习(34):动态sql-choose
- 使用eclipse以及Juint进行测试
- layer中嵌套的页面如何操作父页面_vue中8种组件通信方式,值得收藏
- 蹭热度?罗永浩:下一个创业项目是“元宇宙公司”
- Clojure Web 开发 (一)
- 入门Sysmac Studio,白菜妹子是这样做的。
- 苹果电脑删除下载的更新文件_解决电脑管家病毒库更新误删除T6文件方法
- 西门子g120变频器接线图_西门子1500PLC通过工艺对象对G120变频器组态和调试
- 使无效html代码,blockquote p css无效,让blockquote p不缩进的方法
- Windows找不到合适的打印机驱动程序
- axure树形表格_树状菜单 表格 水平菜单 垂直菜单
- 安装 ubuntu 18.04登录界面卡死解决
- realpath函数使用注意事项
- 【JavaSE】网络编程(606~630)
- matlab程序代码 伪码捕获_MATLAB程序转为伪代码
- 正则表达式匹配电话号码