python基础教程_学习笔记25:程序打包

程序打包

准备发布程序时,开发者在程序发布前可能会想到将其打包。如果只有一个.py文件,那将不是什么大问题,但如果面对的是非程序员用户,甚至在正确位置放置一个简单的python库文件,或者处理PYTHONPATH变量这类工作都超出了他们的能力范围的话,就不好办了。用户通常只想双击一个安装程序,跟着安装向导一步一步走,接着程序就可以运行了。

distutils是每个程序员工具包内的基础工具,而且事实上distutils能做到比基于脚本的python库安装程序还要多:它可以用来建立简单的windows安装程序,再加上扩展程序py2exe,就能建立独立的windows可执行程序了。

distutils基础

代码:

from distutils.core import setup

setup(name=‘Hello‘,

version=‘1.0‘,

description=‘A simple example‘,

author=‘signjing‘,

py_modules=[‘hello‘])

在setup函数内,不必提供所有这些信息(事实上可以不提供任何参数),也可以提供更多的参数。所提供的变量名称的含义应该是一目了然的。

将脚本存储为setup.py(Distutils安装脚本的惯例),确保在同一个目录下存在名为hello.py的模块文件。

警告:运行这个setup脚本会在当前目录创建新的文件和子目录,所以最好在全新的目录中进行试验,避免旧文件被覆盖。

执行如下命令:

python setup.py

输出:

usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]

or: setup.py --help [cmd1 cmd2 ...]

or: setup.py --help-commands

or: setup.py cmd --help

error: no commands supplied

可以使用--help或者--help-commands选项开关获得更多信息。试着使用build命令,看看distutils有什么反应:

python setup.py build

输出:

running build

running build_py

creating build

creating build\lib

copying hello.py -> build\lib

Distutils创建了build的子目录,其中包含名为lib的子目录,并且把hello.py的一个副本放置在build/lib内。build子目录是distutils组装包(以及编译扩展库等)的工作区。在安装的时候不需要运行build命令。如果需要的话,在运行install命令的时候它就自动运行了。

试试:

python setup.py build

输出:

running install

running build

running build_py

running install_lib

copying build\lib\hello.py -> D:\software(x86)\Python27\Lib\site-packages

byte-compiling D:\software(x86)\Python27\Lib\site-packages\hello.py to hello.pyc

running install_egg_info

Writing D:\software(x86)\Python27\Lib\site-packages\Hello-1.0-py2.7.egg-info

这就是安装python模块、包和扩展到标准机制。你要做的就是提供安装脚本。

提供选项的各种方法可以指定安装什么程序,以及在哪里安装这类事情。更棒的是这些选项有多种用途。

打包

写完供用户安装模块使用的setup.py脚本以后,就可以用它来建立存储文件,windows安装程序或者rpm包。

建立存档文件

可以使用sdist命令(用于“源代码发布”):

python setup.py sdist

运行脚本后,可能会得到一大堆输出,其中还有一些警告。得到的警告包括缺少author_email选项、MANIFEST.in文件和README文件。也可放心忽略所有这些警告(当然,在setup.py中加上author_email选项也没问题,它与在当前目录添加README或者README.txt文本文件,以及空的MANIFEST.in文件类似)。

警告之后,应该会看到类似下面的输出:

writing manifest file ‘MANIFEST‘

creating Hello-1.0

copying files to Hello-1.0...

copying hello.py -> Hello-1.0

copying setup.py -> Hello-1.0

creating dist

creating ‘dist\Hello-1.0.zip‘ and adding ‘Hello-1.0‘ to it

adding ‘Hello-1.0\hello.py‘

adding ‘Hello-1.0\PKG-INFO‘

adding ‘Hello-1.0\setup.py‘

removing ‘Hello-1.0‘ (and everything under it)

在创建源代码发布程序时,程序同时会创建叫做MANIFEST的文件,其中包括所有文件的列表。MANIFEST.in文件是清单(manifest)的模板,在指明安装内容时要用到,可以使用如下命令来指定想要包含的文件。如果distutils自己没有指明要安装的文件,可以使用setup.py脚本(以及默认包含的文件,如README)。

include somedirectory/somefile.txt

include somedirectory/*

现在除了build子目录外,应该还有一个dist子目录。可以在它里面找到一个叫做Hello-1.0.tar.gz的gzip格式的tar存档文件。现在可以将其发布给其他人,利用内置的setup.py脚本解包和安装。还可以选择很多发布格式,可以通过命令行的选项开关--formats进行设定。

创建windows安装程序或rpm包

使用bdist命令可以创建单一的windows安装程序和linux prm文件。bdist可用的格式有rpm和wininst。

有意思的是在非windows操作系统内也可以为程序包建立windows安装程序,前提是没有任何需要编译的扩展。

编译扩展

使用py2exe创建可执行

py2exe作为Distutils的扩展可用来创建可执行的windows程序(.exe文件),如果不想让用户单独安装python解释器的话,它就能大显神威了。

在创建可执行程序之后,还可能需要使用一个安装程序——如inno setup——来发布可执行程序和由py2exe创建的附加文件。

py2exe可以创建拥有gui的可执行文件。

时间: 2024-10-11 18:52:44

python基础教程_学习笔记25:程序打包的相关文章

python基础教程_学习笔记23:图形用户界面

图形用户界面 丰富的平台 在编写Python GUI程序前,需要决定使用哪个GUI平台. 简单来说,平台是图形组件的一个特定集合,可以通过叫做GUI工具包的给定Python模块进行访问. 工具包 描述 Tkinter 使用Tk平台.很容易得到.半标准. wxpython 基于wxWindows.跨平台越来越流行. PythonWin 只能在Windows上使用.使用了本机的Windows GUI功能. JavaSwing 只能用于Jython.使用本机的Java GUI. PyGTK 使用GTK

python基础教程_学习笔记16:标准库:一些最爱——random

标准库:一些最爱 random random模块包括返回随机数的函数,可以用于模拟或者用于任何产生随机输出的程序. 事实上,所产生的数字都是伪随机数,它们以一个可预测的系统作为基础,除非是为了强加密的目标,否则这些随机数还是足够随机的.如果真的需要随机性,可以使用os模块的urandom函数. 重要函数 函数 描述 random() 返回0<=n<1之间的随机实数n,其中0<n<=1 getrandbits(n) 以长整型形式返回n个随机位(二进制数) uniform(a,b) 返

python基础教程_学习笔记20:标准库:一些最爱——os

标准库:一些最爱 os os模块为你提供了访问多个操作系统服务的功能. os和它的子模块os.path还包括一些用于检查.构造.删除目录和文件的函数,以及一些处理路径的函数. os模块中一些重要函数和变量 函数/变量 描述 environ 对环境变量进行映射 system(command) 在子shell中执行操作系统命令 sep 路径中的分隔符 pathsep 分隔路径的分隔符 linesep 行分隔符('\n','\r','\r\n') urandom(n) 返回n字节的加密强随机数据 os

python基础教程_学习笔记7:条件、循环、其它语句

条件.循环.其它语句 print和import 随着更加深入地学习python,可能会出现这种感觉:有些自以为已经掌握的知识点,还隐藏着一些让人惊讶的特性. 使用逗号输出 打印多个表达式,只要将这些表达式用逗号隔开即可: >>> print "age:",28 age: 28 参数之间都插入了一个空格符. 如果在结尾加上逗号,那么接下来的语句会与前一条语句在同一行打印: print "Hello,", print "World!"

python基础教程_学习笔记3:元组

元组 元组不能修改:(可能你已经注意到了:字符串也不能修改.) 创建元组的语法很简单:如果用逗号分隔了一些值,那么你就自动创建了元组. >>> 1,3,'ab' (1, 3, 'ab') 元组也是(大部分时候是)通过圆括号括起来的. >>> (1,3,'13') (1, 3, '13') 空元组可以用没有内容的两个圆括号来表示. 如何实现包括一个值的元组呢? >>> (5) 5 >>> ('ab') 'ab' >>>

python基础教程_学习笔记9:抽象

抽象 懒惰即美德. 抽象和结构 抽象可以节省大量工作,实际上它的作用还要更大,它是使得计算机程序可以让人读懂的关键. 创建函数 函数可以调用(可能包含参数,也就是放在圆括号中的值),它执行某种行为并且返回一个值.一般来说,内建的callable函数可以用来判断函数是否可调用: >>> import math >>> y=1 >>> x=math.sqrt >>> callable(x) True >>> callab

python基础教程_学习笔记10:异常

异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行: >>> 1/0 Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 1/0 ZeroDivisionError: integer division or modulo by

python基础教程_学习笔记5:字符串

字符串 基本字符串操作 字符串也是序列,因此序列的基本操作(索引.分片.连接.乘法.长度.求最大值和最小值.成员资格)对字符串同样适用: 索引 >>> 'a_string'[0] 'a' 长度 >>> len('a_string') 8 求最大值 >>> max('a_string') 't' 求最小值 >>> min('a_string') '_' 乘法 >>> 'a_string'*2 'a_stringa_st

python基础教程_学习笔记26:好玩的编程

好玩的编程 程序设计的柔术 当大家坐下来并计划应该如何组织程序的时候,对于这个具体的程序,还没有任何的经验.在实现功能的时候,会逐渐地学到对原始设计有用的新知识.不应该无视一路走来所吸取的教训,而应该将它们用于软件的重新设计(或重构)中. 灵活性的实现包括许多方面,下面是其中两个: 原型设计:python最棒的功能之一就是可以快速地编写程序.编写原型程序是更充分地了解问题的一种很好的方法. 配置:灵活性有很多种存在形式.配置的目的就是让程序某部分的改变更简单,对于你和用户来说都是这样. 第三点是