1。模块与导入语句
任何Python源文件都能以模块的形式使用,例如:
<代码> # spam.py=37 def foo (): 打印(“我foo和% s”%) def bar (): print(“我酒吧和我打电话foo”) 类垃圾邮件(对象): def神交(自我): 打印(“我Spam.grok”) 代码>
要以模块的形式加载这段代码,可以使用进口垃圾语句。首次使用进口加载模块时,它将做3件事:
1)创建新的命名空间,用作在相应源文件中定义的所有对象的容器。
2)在新创建的命名空间中执行模块中包含的代码。
3)在调用函数中创建名称为引用模块命名空间,这个名称与模块的名称相匹配,例如:
<代码>进口垃圾邮件 x=spam.a spam.foo () s=spam.Spam () s.grok() 代码>
进口执行已加载源的文件中的所有语句。要导入多个模块,可以为进口提供逗号分隔的模块名称列表,例如:
<代码>进口套接字,操作系统,re 代码>
用于引用模块的名称可以使用,限定符进行更改,例如:
<代码>进口垃圾sp 进口套接字网络 sp.foo () sp.bar () net.gethostname() 代码>
导入语句可以出现在程序中的任何位置,但是每个模块中的代码仅加载和执行一次。
2。从模块导入选定符号
从语句用于将模块中的具体定义加载到当前命名空间中从语句相当于进口,但它不会创建一个名称来引用新创建的模块命名空间,而是将对模块中定义的一个或多个对象的引用放到当前命名空间中,例如:
<代码>从垃圾邮件导入foo foo () spam.foo () # NameError 代码>
从语句还会接受用逗号分隔的对象名称列表,例如:
<代码>从垃圾邮件导入(foo, bar、垃圾邮件)代码>
另外,限定符可用于重命名使用从导入的具体对象,例如:
<代码>从垃圾邮件垃圾邮件作为Sp导入 s=Sp() 代码>
“*“星号通配符也可用于加载模块中的所有定义,但以下划线开头的定义除外,例如:
<代码>从垃圾邮件导入* 代码>
表单模块导入语句只能在模块最顶层使用。通过定义列表__all__,模块可以精确控制从垃圾邮件导入\
导入的名称集合,例如:<代码> # spam.py __all__=['酒吧','垃圾']代码>
使用从导入形式导入定义不会更改定义的作用域规则。函数的全局命名空间始终是定义该函数的模块,而不是将函数导入并调用该函数的命名空间。
3。模块搜索路径
加载模块时,解释器在sys.path路径中搜索字典列表.sys.path中的第一个条目通常是空字符串,表示当前正在使用的字典.sys.path中的其他条目可能包含字典名称,. zip归档文件和.egg文件。各个条目在sys.path中列出的顺序决顺决定了加载模块时的搜索顺序。
可以将一组模块打包为一个文件,设想创建两个模块foo.py和bar.py,并将它们放在一个名为mymodules.zip的zip文件中,就可以以如下方式添加到搜索路径:
<代码>导入系统 sys.path.append (“mymodules.zip”) 进口foo,酒吧代码>
zip文件可以与常规路径名称组件混合使用,例如:
<代码> sys.path.append (“/tmp/modules.zip/lib/python”) 代码>
从zip中导入需要注意一些限制。首先,只能从归档文件中导入. py, .pyw, .pyc和.pyo文件,而且,从归档文件加载py文件时,Python不会建.pyc和。巴西文件,这会导致加载模块时的性能下降。
4。模块加载和编译
使用进口加载的模块实际上可分为4个通用类别:
1)使用Python编写的代码
2)已被编译为共享库或DLL的C或c++扩展
3)包含一组模块的包
4)使用C语言编写并链接到Python解释器的内置模块
查看编块(以foo为例)时,解释器在sys.path下的每个目录中搜索以下文件(按搜索顺序列出):
1)目录foo,它定义了一个包
2) foo.pyd foo.so, foomodule.so或foomodule.dll(已编译的扩展)
3) foo.pyo(只适用于使用了- o或oo选项时)
4) foo.pyc
5) foo.py (Windows上还会查找.pyw文件)
对于py文件,首次导入模块时,它会被编译为字节码并作为.pyc文件写回磁盘。在后续导入中,解释器将加载这段预编译的字节码,除非py文件的修改日期要更新一些. . pyc文件与解释器的o选项结合,文件已删除了行号,断言和其他调试信息的字节码。如果指定oo选项,还会从文件中删除文档字符串。