首页 > 代码库 > python基础教程_学习笔记25:程序打包

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.pyDistutils安装脚本的惯例),确保在同一个目录下存在名为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.gzgzip格式的tar存档文件。现在可以将其发布给其他人,利用内置的setup.py脚本解包和安装。还可以选择很多发布格式,可以通过命令行的选项开关--formats进行设定。

创建windows安装程序或rpm

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

 

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

编译扩展

使用py2exe创建可执行

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

 

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

 

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

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