import可以导入俩种类型的文件
1 module
通常模块为一个文件,直接使用import来导入就好了。可以作为module的文件类型有".py"、".pyo"、".pyc"、".pyd"、".so"、".dll"。
2 package
通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。
例子
1 直接导入py文件例子
mystr.py内容为
#coding:utf-8
import sys
def printf(format, *args):
sys.stdout.write(format % args)
def format(format, *args):
return (format % args);
def printf2(format, *args):
sys.stdout.write(format % args)
__all__ = [ 'printf', 'format' ]
#如果一个模块如果定义有列表__all__,则from module import * 语句只能导入__all__列表中存
#在的对象,比如 from module import * 只能使用printf和format
#如果要使用printf2,只能显示写 from module import printf2
测试文件使用mystr.py里面的函数,需要导入,可以这样写
import mystr
mystr.printf("hello world %s", "nihalo")
每次需要引用模块里面的函数时都要注明函数是在哪个模块,以便python能找到调用
-- 如果我觉得mystr这个名字不好或者跟我当前模块定义的一些名字会有冲突,想改变名字是否可以,OK使用as关键字
import mystr as cstring
cstring.printf("hello world %s", "nihalo")
-- 如果觉得不想使用函数或者类每次都要module.xxxx这样的写法,有没办法把被导入模块的一个或多个对象直接放入当前的名字空间,可以使用from关键字,使用from语句可以将模块中的对象直接导入到当前的名字空间
from mystr import *
printf("hello world %s", "nihalo")
-- 一个模块可以被导入,也可以是被直接执行,怎么区分? 每个模块都拥有 __name__ 属性,它是一个内容为模块名字的字符串。最顶层的模块名称是 __main__ .命令行或是交互模式下程序都运行在__main__ 模块内部. 利用__name__属性,我们可以让同一个程序在不同的场合(单独执行或被导入)具有不同的行为
# 检查是单独执行还是被导入
if __name__ == '__main__':
# Yes
statements
else:
# No (可能被作为模块导入)
statements
**注意**
import 语句可以在程序的任何位置使用,你可以在程序中多次导入同一个模块,但模块中的代码*仅仅*在该模块被首次导入时执行。后面的import语句只是简单的创建一个到模块名字空间的引用而已
**模块搜索路径**
导入模块时,解释器会搜索sys.path列表,这个列表中保存着一系列目录,第一个目录就是你执行的py的目录,比如
D:后台处理技术pythonimport
D:Python27Libidlelib
D:Python27libsite-packagesvirtualenv-15.1.0-py2.7.egg
C:WINDOWSsystem32python27.zip
D:Python27DLLs
D:Python27lib
D:Python27libplat-win
D:Python27liblib-tk
D:Python27
D:Python27libsite-packages
D:Python27libsite-packagesPIL
如果要导入的一个文件在一个目录里面,如果不采用包的方式,还可以sys.path.append导入文件所在的路径,这样解释器就能找到文件了
sys.path.append(".\subpymod")
from mystr2 import *
for k in sys.path:
print k
-------------------------------------------------------------------------------------------------------------------------
2 导入包
__init__.py的作用
1. 相当于class中的def __init__(self):函数,用来初始化模块。
2. 把所在目录当作一个package处理
3. from-import 语句导入子包时需要用到它。 如果没有用到, 他们可以是空文件。
如引入package.module下的所有模块
from package.module import *
这样的语句会导入哪些文件取决于操作系统的文件系统. 所以我们在__init__.py 中加入 __all__变量.
该变量包含执行这样的语句时应该导入的模块的名字. 它由一个模块名字符串列表组成.