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的写法如下(参考自官方文档):
1 from distutils.core import setup 2 3 #This is a list of files to install, and where 4 #(relative to the 'root' dir, where setup.py is) 5 #You could be more specific. 6 files = ["things/*"] 7 8 setup(name = "appname", 9 version = "100", 10 description = "yadda yadda", 11 author = "myself and I", 12 author_email = "email@someplace.com", 13 url = "whatever", 14 #Name the folder where your packages live: 15 #(If you have other packages (dirs) or modules (py files) then 16 #put them into the package directory - they will be found 17 #recursively.) 18 packages = ['package'], 19 #'package' package must contain files (see list above) 20 #I called the package 'package' thus cleverly confusing the whole issue... 21 #This dict maps the package name =to=> directories 22 #It says, package *needs* these files. 23 package_data = {'package' : files }, 24 #'runner' is in the root. 25 scripts = ["runner"], 26 long_description = """Really long text here.""" 27 # 28 #This next part it for the Cheese Shop, look a little down the page. 29 #classifiers = [] 30 )
首先,当然是建立一个名字叫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一下,就会发现已经可以导入我们自己的模块了。