路径修改
命令行怎么查看路径,修改路径:
#打印当前搜索路径
import sys
sys.path
sys.path.append(newname)
import os
os.getcwd()
os.chdir("c:\\www\\")
模块实现
构建模块的初衷就是将一些同类的东西进行打包, 以免污染全局空间, 在python的模块里, 对需要隐藏的属性和函数都可以采用
__all__
来实现,__all__
只给出列出想要公共接口和属性, 当前前提是只使用from modu import *
来导入库, 如果使用import modu
则会导入所有的属性; 如下面的模块”Lot2Html”(下面的代码内容不重要):
#coding=utf-8 ''' 定义了一个模块,提供将log.txt转换成html的格式 ''' from OHtml import * import re OH = OHtml() #这是其它地方定义的一个类 #这里只公开creTaskLog这个接口 __all__ = ["creTaskLog"] def dealLogStr(line): pass def __parseTaskLog(logf): pass def creTaskLog(logf,htmlf,title): ''' 将测试log文件创建html各式的文件 :param logf: from log path and filename :param htmlf: to log path and filename :param title: html title ''' ostr,errstr,skpstr = __parseTaskLog(logf) f=open(htmlf,'w+') htmlstr = OH.creHtml(ostr,title=title,errStr=errstr,skStr=skpstr) f.write(htmlstr) f.close()
当在其它地方使用这个模块时, 可以使用
from Log2Html import *
或者import Log2Html
,而这两者存在区别,
1.imprt Log2Html
导入时, 模块里的所有函数都可以被调用, 也就是all对其没有影响;
2.from Log2Html import *
则是优先处理了__all__
中的, 如果有该属性则值提供__all__
里面的属性, 如这里只能读到creTaskLog函数, 其它函数都被封装; 奇怪的是, 网上的资料说如果没有__all__
则会读取所有不是以下划线开头的属性, 而我这里测试发现, 外部可以照样访问__parseTaskLog
函数, 还不清楚什么原因;
总结: 推荐使用from Log2Html import *
和__al__
属性达到封装效果;
包处理
当前测试的包名为OHtml, 同名文件夹里有
__init__.py
和上面的”Log2Html.py” 等其他模块;
这里也主要分析包的封装特性;
先在测试代码里文档里加入路径:
import sys sys.path.append("F:\\Python\\OHtml")
- 这时
__init__
里面什么也不写, 用import OHtml
或from OHtml import *
后,发现都找不到模块Log2Html,可见 对于包的导入,必须在初始化文档里加入想要导出的模块信息;- 在
__init__
里面加上import Log2Html
后,可以正常访问模块里面的所有函数, 当然要加上OHtml的前缀,如OHtml.Log2Html.creTaskLog
- 在
__init__
将上面的import Log2Html
改为__al__=["Log2Html"]
后,发现使用import OHtml是无法读取到模块的, 只能使用from OHtml import*
才可以, 切此时可以访问到Log2Html;模块的所有属性, 好像没有封装;
总结: package的使用, __init__
是必须要添加所要导出的模块的, 可以通过写__al__
和 import … 来完成;
而这两者之间的区别,目前还不是很清楚, 以后有机会再去拜读下源码;
import 导入操作制发生一次;
要重新导入则一个del module后再操作
对比
import是直接导入整个内容, 操作的修改会修改内存中的整个module的数据;
from 是到复制版本, 修改内容不会影响到原先内存中的module;
模块就是命名空间
通过
moud.__dict__.keys()
可以看到里面的属性(包含定义的一些变量 和一些本来就有的变量)
如:
moud.__file__
是路径;
moud.__dco__
是说明字符
reload
热加载功能, 就是修改源文件后不关闭程序重新加载文件的新内容;
import moud # do something from imp import reload reload(moud)