标签:
1. 模块
在python中一个文件可以被看成一个独立模块,而包对应着文件夹,模块把python代码分成一些有组织的代码段,通过导入的方式实现代码重用。
1.1 模块搜索路径
导入模块时,是按照sys.path变量的值搜索模块,sys.path的值是包含每一个独立路径的列表,包含当前目录、python安装目录、PYTHONPATH环境变量,搜索顺序按照路径在列表中的顺序(一般当前目录优先级最高)。
1 >>> import sys 2 >>> sys.path 3 [‘‘, ‘E:\\Python27\\Lib\\idlelib‘, ‘C:\\windows\\system32\\python27.zip‘, ‘E:\\Python27\\DLLs‘, ‘E:\\Python27\\lib‘, ‘E:\\Python27\\lib\\plat-win‘, ‘E:\\Python27\\lib\\lib-tk‘, ‘E:\\Python27‘, ‘E:\\Python27\\lib\\site-packages‘]
1.2 导入模块
1.2.1 使用import语句导入模块
有下面两种方式
import module1 import module2 import module3 import module1,module2,module3
这两种方式的效果是一样的,但是第一种可读性比第二种好,推荐按照下面的顺序导入模块,并且一般在文件首部导入所有的模块
也可以在函数内部导入模块,这样被导入的模块作用域是局部的
1.2.2 使用from-import语句导入模块的属性
单行导入
1 from module import name1,name2,name3
多行导入
from module import name1,name2, name3
导入全部属性(由于容易覆盖当前名称空间中现有的名字,所以一般不推荐使用,适合模块中变量名很长并且变量很多的情况)
如果你不想某个模块的属性被以上方法导入,可以给该属性名称前加一个下划线(_test),如果需要取消隐藏,可以显示的导入该属性(from module import _test)
1.2.3 扩展的import语句
使用自定义的名称替换模块的原始名称
import simplejson as json
模块被导入时,加载的时候模块顶层代码会被执行,如:设定全局变量、类和函数的声明等,所以应该把代码尽量封装到类和函数中。一个模块无论被导入多少次,只加载一次,可以防止多次导入时代码被多次执行。
1.2.4 重新导入模块reroad
1)import
import作用:导入/引入一个python标准模块,其中包括.py文件、带有__init__.py文件的目录。
import module_name[,module1,...] from module import *|child[,child1,...]
说明:多次重复使用import语句时,不会重新加载被指定的模块,只是把对该模块的内存地址给引用到本地变量环境。
a.py #!/usr/bin/env python #encoding: utf-8 import os print ‘in a‘,id(os) m.py #!/usr/bin/env python #encoding: utf-8 import a #第一次会打印a里面的语句 import os #再次导入os后,其内存地址和a里面的是一样的,因此这里只是对os的本地引用 print ‘in c‘,id(os) import a #第二次不会打印a里面的语句,因为没有重新加载
#结果
in a 23124144
in c 23124144
2)reroad
作用:对已经加载的模块进行重新加载,一般用于原模块有变化等特殊情况,reload前该模块必须已经import过。
import os reload(os)
说明:reload会重新加载已加载的模块,但原来已经使用的实例还是会使用旧的模块,而新生产的实例会使用新的模块;
reload后还是用原来的内存地址;
不能支持from。。import。。格式的模块进行重新加载。
1 a.py 2 #!/usr/bin/env python 3 #encoding: utf-8 4 import os 5 print ‘in a‘,id(os) 6 7 m.py 8 #!/usr/bin/env python 9 #encoding: utf-8 10 import a #第一次import会打印a里面的语句 11 print id(a) #原来a的内存地址 12 reload(a) #第二次reload还会打印a里面的语句,因为有重新加载 13 print id(a) #reload后a的内存地址,和原来一样
#结果
>>>
in a 23058608
29617680
in a 23058608
29617680
>>>
2. 包
包是另外一种模块,可以包含其他模块;
模块存储在文件中时(拓展名.py),包就是模块所在的目录;
包必须包括一个__init__.py的文件(模块),若将其作为普通模块导入文件内容就是包的内容
#名为constants的包,文件constants/__init__.py包括语句PI=3.14 import constants print constants.PI
为了将模块放置在包内,直接把模块放在包目录内即可:
1
|
|
3. 指定python文件编码方式
python默认是使用ASCII编码,可以指定编码方式,如
1
2
|
#!/usr/bin/env python #coding=utf-8 |
或者
1
2
|
#!/usr/bin/env python # -*- coding:utf-8 -*- |
4. 解决导入循环问题
有下面两个模块,a.py和b.py
a.py
1
2
3
4
5
6
7
|
#!/usr/bin/env python #coding=utf-8 import b if __name__ = = ‘__main‘ : print ‘hello,I‘ m a‘ |
1
|
b.py |
1
2
3
4
5
6
7
|
#!/usr/bin/env python #coding=utf-8 import a if __name__ = = ‘__main‘ : print ‘hello,I‘ m b‘ |
在这里a尝试导入b,而b也尝试导入a,导入一个先前没有完全导入的模块,会导致导入失败。解决办法:移除一个导入语句,把导入语句放到函数内部,在需要的时候导入。
b.py
1
2
3
4
5
6
|
#!/usr/bin/env python #coding=utf-8 if __name__ = = ‘__main‘ : import a print ‘hello,I‘ m b‘ |
5. 使用技巧
创建一个目录python_apps,编辑~/.bashrc,设定环境变量PYTHONPATH的值为该目录的路径。
1
|
export PYTHONPATH= /home/zhoujh/python_apps :$PYTHONPATH |
然后在python_apps目录下做一个软链接至应用的目录,假如要运行的应用路径为:/home/zhoujh/python_workspace/app
1
|
ln -s /home/zhoujh/python_workspace/app . /app |
这样以后添加新的应用,只需在该目录下创建一个链接就行。
标签:
原文地址:http://www.cnblogs.com/zxqstrong/p/4666646.html