如何发布自定义的python模块

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' ,
      url="http://www.baidu.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增加到当前命名空间中,这样就不用加上命名空间来调用函数了。

?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值