php开发中,我们定义好了一个公用函数,则会将代码放在公用的文件中,需要用到的时候,使用require或者include函数包含这个公用的文件,即可在程序中实现可重用。接下来看看python中如何操作
系统环境:window7 ,python3.4
在c:/python34/HeadFirstPython/目录下创建一个nester目录(此目录为举例说明,属自定义)
在目录中添加两个python程序文件:nester.py和setup.py
nester.py 模块的程序文件,代码如下(实现递归遍历数组):
1
2
3
4
5
6
|
def
print_lol(arr):
for
row
in
arr:
if
(
isinstance
(row ,
list
)):
print_lol(row)
else
:
print
row
|
setup.py 保存模块的安装信息,包含模块名称,模块开发者等信息,代码如下:
1
2
3
4
5
6
7
8
9
10
|
from
distutils.core
import
setup
setup (
name
=
'nester'
,
version
=
'1.0.0'
,
py_modules
=
[
'nester'
],
author
=
'hzc'
,
author_email
=
'980744762@qq.com'
,
description="a sample printer of nested lists"
)
|
name和py_modules这两个参数一定要与nester.py文件名相同,否则发布安装时会发出模块文件找不到的错误
通过命令行,进入nester目录(c:/python34/HeadFirstPython/nester),依次输入下图中红色框的命令
使用python setup.py sdist命令打包代码,生成发布包
打包后会生成目录dist和文件MANIFEST,这2个是发布的生成的包和相关配置文件。
├── dist
│ └── nester-1.0.0.tar.gz
├── MANIFEST
├── nester.py
└── setup.py
使用python setup.py install安装打包代码,即安装nester模块.
发布模块,但还不能在程序中被调用,还需要安装,接着看
See,安装完成,在python环境下产生一个nester-1.0.0-py3.4.egg-info文件,有点类似php扩展的.dll(windows环境下的)
安装后
.
├── build
│ └── lib
│ └─ nester.py
├── dist
│ └── nester-1.0.0.tar.gz
├── MANIFEST
├── nester.py
└── setup.py
安装后出现build目录,这个就是用发布包解压出来的库和模块代码,会统一放到python的模块搜索目录里面去。
模块使用的时候就是import nester(注意使用命名空间)
现在可以在程序中使用刚才安装的nester模块
1
2
3
4
5
|
import
nester
movies
=
[
'a'
,
'b'
,[
'c1'
,
'c2'
]]
nester.
print_lol(movies)
|
1
|
print_lol(movies)
|
系统会发出这样的一个错误信息:
>>> import nester
>>> print_lol(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'print_lol' is not defined
>>>
是因为命名空间的关系,主python程序中(以及idle shell中)的代码与一个名为main的命名空间关联。所以的话不能直接使用print_lol,而要加上命名空间nester.print_lol()
当模块创建以后,系统自动创建一个与模块名称相同的命名空间(nester),并将函数放在命名空间中,简单的通过print_lol调用,自然无法找到函数。
知识点:
1.命名空间是为了让python解释器就会知道去哪里找这个函数,命名空间格式:首先是模块名字,然后是一个点号,再后面是函数名。
2.如果使用from nester import print_lol,就会把指定的函数print_lol增加到当前命名空间中,这样就不用加上命名空间来调用函数了。