关于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(namepathname[, 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模块 实际使用中的坑相关推荐

  1. python imp模块

    发现imp主要有两种用法 imp.find_module(name[,path]) 如果path为空,则按照sys.path路径搜索模块名, 返回三元组(file, pathname, descrip ...

  2. python中的imp模块——让引用模块更加简单

    最近撸代码的时候发现python有一个imp模块,有点儿意思. 首先: pip install imp 看模块名,可以看出其实就是"import"的缩写.在功能上也一样,但用起来比 ...

  3. python中time模块中的倒计时_Python中time模块与datetime模块在使用中的不同之处 python 的time模块获取的是什么时间...

    python的datetime模块的一些问题 time_1 = datetime.datetime.now(pytz.timezone('Asia/Shanghai')) timeimport dat ...

  4. python csv 模块的使用

    python csv 模块的使用 歌曲推荐:攀登(live) csv 是用逗号分隔符来分隔列与列之间的. 1. csv的写入 1.简单的写入,一次写入一行 import csv with open(& ...

  5. python哪个关键字可以导入模块_关于python导入模块import与常见的模块详解

    0.什么是python模块?干什么的用的? Java中如果使用abs()函数,则需要需要导入Math包,同样python也是封装的,因为python提供的函数太多,所以根据函数的功能将其封装在不同的m ...

  6. python pp模块_Python模块--Pexpect

    探索 Pexpect,第 1 部分:剖析 Pexpect 概述 Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输 ...

  7. Python copy模块浅拷贝和深拷贝

    Python copy模块浅拷贝和深拷贝 在开发中,经常涉及到数据的传递,在数据传递使用的过程中,可能会对数据进行修改. 对数据进行处理后,如果在后面的代码中,即需要使用修改之前的数据,也需要使用修改 ...

  8. Python crypto模块实现RSA和AES加密解密

    Python crypto模块实现RSA和AES加密解密 Python的crypto是用于RSA加密解密,AES加密解密的. 一.RSA和AES简介 RSA加密算法是一种非对称加密算法.RSA 是19 ...

  9. Python常用模块集锦

    常用模块主要分为以下几类(缺失的后续再补充): 时间转换 时间计算 序列化和反序列化:json,pickle 编解码:unicode,base64 加解密:md5,sha1,hmac_sha1,aes ...

最新文章

  1. 6种常见的Git错误以及解决的办法
  2. vue用户行为收集_vue 实现移动端键盘搜索事件监听
  3. IOC和DI是什么?
  4. mysql_contents_将MySQLhelpcontents的内容有层次的输出方法推荐
  5. mybatis学习(34):动态sql-choose
  6. 使用eclipse以及Juint进行测试
  7. layer中嵌套的页面如何操作父页面_vue中8种组件通信方式,值得收藏
  8. 蹭热度?罗永浩:下一个创业项目是“元宇宙公司”
  9. Clojure Web 开发 (一)
  10. 入门Sysmac Studio,白菜妹子是这样做的。
  11. 苹果电脑删除下载的更新文件_解决电脑管家病毒库更新误删除T6文件方法
  12. 西门子g120变频器接线图_西门子1500PLC通过工艺对象对G120变频器组态和调试
  13. 使无效html代码,blockquote p css无效,让blockquote p不缩进的方法
  14. Windows找不到合适的打印机驱动程序
  15. axure树形表格_树状菜单 表格 水平菜单 垂直菜单
  16. 安装 ubuntu 18.04登录界面卡死解决
  17. realpath函数使用注意事项
  18. 【JavaSE】网络编程(606~630)
  19. matlab程序代码 伪码捕获_MATLAB程序转为伪代码
  20. 正则表达式匹配电话号码

热门文章

  1. AD管理之三,企业根CA的安装
  2. 农民工上网求职事半功倍
  3. 简单的图片处理servlet
  4. Linux系统Git环境配置
  5. Git客户端TortoiseGit(Windows系统)的使用方法
  6. Supervisor行为分析和实践
  7. 安装Oracle 10g sys,system 密码忘记设置解决办法
  8. SQL查询语句[0]
  9. 微信公众平台消息接口开发(13)多语种互译
  10. KAIXIN000发狠 誓将匿名制进行到底!