学习python也已经有一段时间了,发现python作为脚本语言一个很重要的特点就是简单易用,而且拥有巨多的第三方库,几乎方方面面的库都有,无论你处于哪个行业,想做什么工作,几乎都能找到对应的第三方库。别人造好了轮子,我们直接拿过来用,这大大方便了开发,也极大地提升了效率。那么问题来了,有那么多的第三方库,我们如何开发一个属于自己的库呢?其实这是一个比较大的问题,因为开发一个库涉及到的问题很多,比如这个库要用来干嘛,实现什么功能,有没有已经类似的库了,效率如何等。但是这里,我只想抛砖引玉,简单记录一下开发的基本流程。

  编写python的第三方库,最终要的一个工作就是编写setup.py了,其实如果我们下载过一些第三库的源代码文件,打开之后一般就会有一个setup.py,执行python setup.py install 就可以安装这个库了。setup.py 如何编写内容很多,可以参考官方文档:https://wiki.python.org/moin/Distutils/Tutorial?highlight=%28setup.py%29。一个典型的setup.py的写法如下(参考自官方文档):

 from distutils.core import setup

 #This is a list of files to install, and where
#(relative to the 'root' dir, where setup.py is)
#You could be more specific.
files = ["things/*"] setup(name = "appname",
version = "",
description = "yadda yadda",
author = "myself and I",
author_email = "email@someplace.com",
url = "whatever",
#Name the folder where your packages live:
#(If you have other packages (dirs) or modules (py files) then
#put them into the package directory - they will be found
#recursively.)
packages = ['package'],
#'package' package must contain files (see list above)
#I called the package 'package' thus cleverly confusing the whole issue...
#This dict maps the package name =to=> directories
#It says, package *needs* these files.
package_data = {'package' : files },
#'runner' is in the root.
scripts = ["runner"],
long_description = """Really long text here."""
#
#This next part it for the Cheese Shop, look a little down the page.
#classifiers = []
)

首先,当然是建立一个名字叫setup.py的文件啦。 从distutils.core 导入 setup, 然后编写 setup()函数,这个函数里面有相当多的属性,比如version 代表版本号,description 是描述文档,author是作者等,如果是正规的开发,所有这些东西都应该按照规范去写。其中比较重要的几个选项是,name,表示模块的名称。packages,表示包所在的目录,如果我们要打包的所有python文件都在根目录,即和setup.py是一个目录,那么直接写 packages=[""]就可以了。如果python文件在一个单独的文件夹,和setup.py不在同一个目录,则需要写 package_dir=["":"python 文件所在的目录名字"],比如如果有foo1.py 和 foo2.py这两个文件,在src这个文件夹,那么需要写package_dir=["":"src"],同时写

packages=[""],打包就可以导入foo1和foo2两个模块了。如果想在同一个包中包含多个模块,比如在foo包中包含foo1和foo2两个模块,则可以直接把foo1.py和foo2.py所在的文件夹直接命名为foo,然后写 packages["foo"] (注意foo文件夹需要有__init__.py这个文件,可以为空,这样才能引用到foo1和foo2)。其他还有很多写法,这篇博文总结的很好,http://www.cnblogs.com/UnGeek/p/5922630.html,需要的朋友可以参考下。有的时候我们写的代码需要引入一些额外的信息文件,比如文本文件,或者图片,说明文件等等,这些东西是需要一块打包的,那么这个时候该如何指定呢?此时需要用到 data_files 这个选项了。data_files的写法是:data_files= [('文件要放入的文件夹1',

['file1',file2']),('文件要放入的文件夹2',['file3',file4'])],file1,file2等是文件的名称,注意data_files的元素都是元组,元组的第一个元素是文件要放入的文件夹名称,第二个元素是文件列表。这里需要注意的是,如果不想把文件放入文件夹,可以将元组的第一个元素指定为空字符串,此时要打包的文件要被放入根目录,这里根目录是指python解释器所在的目录。比如我需要将文件资源放入python解释器所在目录下的/Lib/site-packages/myfolder路径,myfolder是自定义的文件夹,元组的第一个元素就可以写‘Lib/site-packages/myfolder’,打包时会自动在指定位置新建一个名为myfolder的目录,将文件资源放入其中。

其实 setup.py 文件的编写还有非常多的内容,这里只是介绍了九牛一毛。后面接触到了更复杂的再继续补充吧。具体还是要参考官方文档。

最后一步就是打包命令了。这篇文章讲的非常详细:http://blog.csdn.net/lynn_kong/article/details/17540207,大家自行参考。

简单来说,linux下的打包命令是:python setup.py sdist 为模块创建一个源码包。在windows下,可以使用 python setup.py bdist_wininst 生成一个exe文件。双击该exe文件,就会弹出python库的安装界面(就是经典的蓝色界面),可以自己选择要安装的位置(特别是电脑中有多个版本的python的时候,需要指定这个库装到哪个python库目录下),一路下一步,就安装成功了。此时去指定的python库目录下,就会发现多出了一些我们自己安装的文件以及文件夹。此时试着import一下,就会发现已经可以导入我们自己的模块了。

python 编写简单的setup.py的更多相关文章

  1. python的构建工具setup.py

    一.构建工具setup.py的应用场景 在安装python的相关模块和库时,我们一般使用“pip install  模块名”或者“python setup.py install”,前者是在线安装,会安 ...

  2. 使用Python编写简单的端口扫描器的实例分享【转】

    转自 使用Python编写简单的端口扫描器的实例分享_python_脚本之家 http://www.jb51.net/article/76630.htm -*- coding:utf8 -*- #!/ ...

  3. Python 利用Python编写简单网络爬虫实例3

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.51testing. ...

  4. Python 利用Python编写简单网络爬虫实例2

    利用Python编写简单网络爬虫实例2 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://www.51testing. ...

  5. python编写简单的html登陆页面(4)

    python编写简单的html登陆页面(4)   1  在python编写简单的html登陆页面(2)的基础上在延伸一下: 可以将动态态分配数据,建立表格,存放学生信息 2 实现的效果如下: 3  动 ...

  6. python编写简单的html登陆页面(3)

    1  在python编写简单的html登陆页面(2)的基础上在延伸一下: 可以将静态分配数据,建立表格,存放学生信息 2  加载到静态数据 3  html的编写直接在表格里添加一组数据就行了 4  V ...

  7. python编写简单的html登陆页面(2)

    1  在python编写简单的html登陆页面(1)的基础上在延伸一下: 可以将动态分配数据,实现页面跳转功能: 2  跳转到新的页面:return render_template('home1.ht ...

  8. 用Python编写简单的发红包程序和计算器原理

    用Python编写简单的发红包程序: 第一种解法:数轴方法解决 import random def red_packet(money,num): money = money * 100 #将钱数转换成 ...

  9. 简单使用setup.py来安装Python项目

    最近做个一个项目需要用到setup.py 这个构建工具来进行项目的便捷安装,把搜集到的一些资料加上个人理解整理成文章,如有错误的地方请各位大佬及时指出,小弟马上修改,下面正式进入setup.py的描述 ...

随机推荐

  1. [PHP] PHP源码常用代码中的宏定义

    PHP源码常用代码宏定义:#define 宏名 字符串#表示这是一条预处理命令,所有的预处理命令都以#开头.define是预处理命令.宏名是标识符的一种,命名规则和标识符相同.字符串可以是常数.表达式 ...

  2. 关于React中状态保存的研究

    在使用react搭配react-router做应用的时候,你可能遇到这样的问题,当我从第一个页面过渡到第二个页面,然后返回之后,发现之前的页面的状态全部不见了,即回到了初始的状态. 这点在页面存在多个 ...

  3. PHP获取DHCP分配的本机IP

    在搭建本地环境的时候,需要用到多个设备,有服务器.打印机连接接设备等.因为DHCP动态分配IP,所以每次重连都会发生IP地址的变更. 解决办法就是将每个设备的本机IP上传到统一的地方保存.因为使用RE ...

  4. Linux-RED HAT6.8扩容

    项目快上线了,在准生产测试,遇到了一个问题,那就是Linux硬盘资源不够用了,这个问题是当时在装系统的时候,应该装机人员的失误造成的,具体如下: 这个报错原因就是硬盘资源不够用了,使用命令:df  - ...

  5. 【JavaScript数组】

    1.什么是数组--Array 数组就是一组数据的集合 其表现形式就是内存中的一段连续的内存地址 数组名称其实就是连续内存地址的首地址 2.关于js中的数组特点 数组定义时无需指定数据类型 数组定义时可 ...

  6. OOAD-设计模式(一)概述

    前言 在我们很多时候设计代码都是需要用到各种不一样的设计模式的,接下来着几篇给大家领略一下设计模式.知道设计模式的作用,以及在代码的具体体现.很多时候我们看不懂代码就是因为我们不知道它使用的设计模式. ...

  7. isdigit函数

    isdigit是计算机应用C语言中的一个函数,主要用于检查参数c是否为阿拉伯数字0到9. 相关函数 isdigit 表头文件 #include <ctype.h>(C语言),#includ ...

  8. poj_2195Going Home(最小费用最大流)

    poj_2195Going Home(最小费用最大流) 标签: 最小费用最大流 题目链接 题意: 有n*m的矩阵,H表示这个点是一个房子,m表示这个点是一个人,现在每一个人需要走入一个房间,已经知道的 ...

  9. vue vue-style-loader !css-loader错误

    最近在学习vue框架,使用webpack打包vue项目,在执行npm run start的时候 出现如下错误: This dependency was not found: * !!vue-style ...

  10. [图像类名词解释][ RGB YUV HSV相关解释说明]

    一.概述 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间.但被描述的颜色对象本身是客观的,不同颜色空间只是从不同的角度去衡量同一个对象.颜色空间按照基本机 ...