程序打包
准备发布程序时,开发者在程序发布前可能会想到将其打包。如果只有一个.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的可执行文件。