python 编写简单的setup.py
学习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的更多相关文章
- python的构建工具setup.py
一.构建工具setup.py的应用场景 在安装python的相关模块和库时,我们一般使用“pip install 模块名”或者“python setup.py install”,前者是在线安装,会安 ...
- 使用Python编写简单的端口扫描器的实例分享【转】
转自 使用Python编写简单的端口扫描器的实例分享_python_脚本之家 http://www.jb51.net/article/76630.htm -*- coding:utf8 -*- #!/ ...
- Python 利用Python编写简单网络爬虫实例3
利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.51testing. ...
- Python 利用Python编写简单网络爬虫实例2
利用Python编写简单网络爬虫实例2 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://www.51testing. ...
- python编写简单的html登陆页面(4)
python编写简单的html登陆页面(4) 1 在python编写简单的html登陆页面(2)的基础上在延伸一下: 可以将动态态分配数据,建立表格,存放学生信息 2 实现的效果如下: 3 动 ...
- python编写简单的html登陆页面(3)
1 在python编写简单的html登陆页面(2)的基础上在延伸一下: 可以将静态分配数据,建立表格,存放学生信息 2 加载到静态数据 3 html的编写直接在表格里添加一组数据就行了 4 V ...
- python编写简单的html登陆页面(2)
1 在python编写简单的html登陆页面(1)的基础上在延伸一下: 可以将动态分配数据,实现页面跳转功能: 2 跳转到新的页面:return render_template('home1.ht ...
- 用Python编写简单的发红包程序和计算器原理
用Python编写简单的发红包程序: 第一种解法:数轴方法解决 import random def red_packet(money,num): money = money * 100 #将钱数转换成 ...
- 简单使用setup.py来安装Python项目
最近做个一个项目需要用到setup.py 这个构建工具来进行项目的便捷安装,把搜集到的一些资料加上个人理解整理成文章,如有错误的地方请各位大佬及时指出,小弟马上修改,下面正式进入setup.py的描述 ...
随机推荐
- MyEclipse10.7 10.6导出war文件报错 “SECURITY ALERT: INTEGERITY CHECK ERROR”
myeclipse10.7的版本破解后,导出war包时报“SECURITY ALERT: INTEGERITY CHECK ERROR”的错误. 经过测试本次破解可以解决此错误,只需替换一个jar文件 ...
- cs231n spring 2017 lecture14 Reinforcement Learning 听课笔记
(没太听明白,下次重新听) 1. 增强学习 有一个 Agent 和 Environment 交互.在 t 时刻,Agent 获知状态是 st,做出动作是 at:Environment 一方面给出 Re ...
- JDBC(二)之JDBC处理CLOB和BLOB及事务与数据库元数据获取
前面大概介绍了JDBC连接数据库的过程,以及怎么操作数据库,今天给大家分享JDBC怎么处理CLOB和BLOB存储图片的事情,以及JDBC怎么去处理事务.怎么在插入数据的时候生成主键返回值 一.JDBC ...
- UVAlive 3708 Graveyard(最优化问题)
题目描述: 在周长10000的圆上,初始等距的放置着n个雕塑,现在新加入m个雕塑,要使得这n+m个雕塑仍然等距,问原来n个雕塑要移动的距离总和的最小值. 原题地址: http://acm.hust.e ...
- BZOJ:4530: [Bjoi2014]大融合
4530: [Bjoi2014]大融合 拿这题作为lct子树查询的练手.本来以为这会是一个大知识点,结果好像只是一个小技巧? 多维护一个虚边连接着的子树大小即可. #include<cstdio ...
- 【Java学习笔记之十三】初探Java面向对象的过程及代码实现
理解Java面向对象的重要知识点: 一. 类,对象 类?首先举一个例子:小李设计了一张汽车设计图,然后交给生产车间来生产汽车,有黑色的.红色的.白色的... 这里,汽车设计图就是我们说的类(class ...
- bzoj:1723: [Usaco2009 Feb]The Leprechaun 寻宝
Description 你难以想象贝茜看到一只妖精在牧场出现时是多么的惊讶.她不是傻瓜,立即猛扑过去,用她那灵活的牛蹄抓住了那只妖精. “你可以许一个愿望,傻大个儿!”妖精说. “财富 ...
- Vijos P1131 最小公倍数和最大公约数问题【暴力】
最小公倍数和最大公约数问题 描述 输入二个正整数x0,y0(2≤x0≤100000,2≤y0≤1000000),求出满足下列条件的P.Q的个数. 条件:1.P.Q是正整数 2.要求P.Q以xO为最大公 ...
- C语言中结构体赋值问题的讨论(转载)
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- [国嵌攻略][151][nandflash驱动程序设计]
初始化 打开/drivers/mtd/nand/s3c2410.c找到nand flash驱动程序代码,找到模块初始化函数s3c_nand_init,找到platform_driver中的probe函 ...