1.模块
Python的强大,很大程度是因为Python不仅有自带的模块(标准库),还有海量的第三方模块,并且Python程序员自己也可以开发新的模块。
从本质上来讲,模块就是程序,就是一个扩展名为.py的Python程序。也就是说,定义模块,只要使用文本编辑器,把以下Python代码输入到文本中,然后以.py为后缀名进行保存,任何此类文件都会被认为是Python模块。
比如说,下面的代码输入到一个文件a.py中,就可以把a看做是一个模块。
# conding=utf-8
def printme(var):
print var
把该文件的目录加入sys.path,就可以使用import a导入模块,并且能够执行a.printme(3)之类的语句。
2.导入模块
import语句可以导入一个模块,例如import os。还可以使用as作为限定符进行更改,如import os as operation_system.
更改已导入模块的名称对于编写可扩展的代码很有用。例如有两个模块xmlreader.py和csvreader.py,它们都定义了函数read_data(filename),作用是从文件中读取一些数据,但采用不同的输入格式。可以编写代码来选择性的挑选读取模块。例如:
if format == ‘xml’:
import xmlreader as reader
elif format == ‘csv’:
import csvreader as reader
data = reader.read_data(filename)
也可以使用from module_name import xxx_module来导入模块。xxx_module可以为通配符星号(*),可以用于加载模块中的所有定义,但以下划线开头的定义除外,因为在Python中,以单下划线开头的变量是私有变量。私有变量可以通过import pp,然后使用pp._private_variable之类的来调用;也可以通过在pp.py中,增加__all__变量以及相应的值,在列表中包含需要访问私有变量的名字和私有函数的名字。
3.包
包可以用于将一组模块分组到一个常见的包名称下。这项技术有助于解决不同应用程序中使用模块名称之间的命名空间冲突问题。包是通过使用与其相同的名称创建目录,并在该目录中创建文件__init__.py。
在导入包时,需要注意的是,form package import * 语句,只会导入包目录的__init__.py文件中定义的所有名称。这种行为可以通过定义列表__all__来修改,也可以使用相对导入的方法来加载子模块,如from . import module和from ../package2 import module。
4.分发Python程序和库
要将Python程序分发给他人,应该使用distutils模块。
作为准备,首先应该讲程序有序地组织到一个包含 Readme文件、支持文档和源代码的目录中。通常,这个目录将包含一组库模块、包和脚本。
下面给出一个包含Python代码的目录:
spam/
Readme.txt
Documentation.txt
libspam.py# 一个库模块
spampkg/# 一个支持模块包
__init__.py
foo.py
bar.py
runspam.py # 将作为python runspam.py运行的脚本
组织好代码之后,在最顶级目录中创建文件setup.py。在该文件中添加以下代码:
# setup.py
from distutils.core import setup
setup(name = 'spam',
version = '1.0',
py_modules = ['libspam'],
packages = ['spampkg'],
scripts = ['runspam.py'])
在setup()调用中,py_modules参数是所有单一文件Python模块的列表,packages是所有包目录的列表,scripts是脚本文件的列表。
然后在命令行中输入 python setup.py sdist即可进行源代码分发。
这将在目录spam/dist下创建一个归档文件,如spam-1.0.tar.gz或spam-1.0.zip。
如果输入 python setup.py bdist,将创建一个二进制分发程序,其中的所有.py文件都已预编译为.pyc文件并放置在 与本地平台的目录结构类似的目录结构中。