网天下网站建设,wordpress手机管理APP,网站背景图片素材,淘宝客做的最好的网站第十八章 程序打包
Setuptools和较旧的Distutils都是用于发布Python包的工具包#xff0c;能够使用Python轻松地编写安装脚本。这些脚本可用于生成可发布的归档文档#xff0c;供用户用来编译和安装编写库。
Setuptools并非只能用于创建基于脚本的Python安装程序#xff0…第十八章 程序打包
Setuptools和较旧的Distutils都是用于发布Python包的工具包能够使用Python轻松地编写安装脚本。这些脚本可用于生成可发布的归档文档供用户用来编译和安装编写库。
Setuptools并非只能用于创建基于脚本的Python安装程序还可用于编译扩展。
通过将其与扩展py2exe和py2app结合起来使用还可创建独立的Windows和macOS可执行程序。
Setuptools基础
如果没有安装Setuptools可使用pip安装
简单的Setuptools安装脚本setup.py 请将代码所示的脚本存储为setup.py这适用于所有的Setuptools安装脚本并确保其所在目录包含简单模块beyond.py。
from setuptools import setupsetup(nameBeyond,version1.0,descriptionA simple example,authorbeyondyanyu,py_modules[beyond])使用这个简单的脚本
python setup.py将出现类似于下面的输出
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]or: setup.py --help [cmd1 cmd2 ...]or: setup.py --help-commandsor: setup.py cmd --helperror: no commands supplied要获得更多的信息可使用开关--help或--help-commands。
执行命令build让Setuptools行动起来。
python setup.py build将出现类似于下面的输出
running build
running build_py
creating build
creating build/lib
copying beyond.py - build/libSetuptools创建了一个名为build的目录其中包含子目录lib。同时将将beyond.py复制到了这个子目录中。目录build相当于工作区Setuptools在其中组装包以及编译扩展库等。安装时不需要执行命令build因为当你执行命令install时如果需要命令build会自动运行。 在上述这个示例中命令install将把模块beyond.py复制到PYTHONPATH指定的特定目录中。这应该不会带来风险但如果你不想弄乱系统应该将其删除。
安装install这个模块
python setup.py install输出应该非常多其末尾的内容类似于下面这样
Installed /path/to/python3.5/site-packages/Beyond-1.0-py3.5.egg
Processing dependencies for Beyond1.0
Finished processing dependencies for Beyond1.0 byte-compiling在安装过程中Setuptools创建了一个.egg文件这是一个独立的Python包。 在这个脚本中只使用了Setuptools指令py_modules。如果要安装整个包可以类似的方式列出包名使用指令packages。
打包
编写让用户能够安装模块的脚本setup.py后就可使用它来创建归档文件了。 这里主要介绍如何创建.tar.gz文件
要创建源代码归档文件可使用命令sdist表示source distribution。
python setup.py sdist如果执行上述命令可能出现大量的输出其中包括一些警告。完全可以对这些警告置若罔闻但也可在脚本setup.py中添加author_email类似于选项author并在当前目录中添加文本文件README.txt。
现在除目录build外应该还有一个名为dist的目录。在这个目录中有一个名为Beyond-1.0.tar.gz的文件。 可将其分发给他人而对方可将其解压缩再使用脚本setup.py进行安装。
不想生成.tar.gz文件还有其他几种分发格式可供使用。要设置分发格式可使用命令行开关--formats这个开关为复数形式表明你可指定多种用逗号分隔的格式这样将一次性创建多个归档文件。要获悉可使用的格式列表可给命令sdist指定开关--help-formats。
编译扩展
假设这个源代码文件palindrome2.c位于当前目录中第17章中程序palindrome的源代码则可使用下面的setup.py脚本来编译并安装它
一个回文检查示例palindrome2.c
#include Python.hstatic PyObject *is_palindrome(PyObject *self, PyObject *args) {int i, n;const char *text;int result;if (!PyArg_ParseTuple(args, s, text)) {return NULL;}nstrlen(text);result 1;for (i 0; i n/2; i) {if (text[i] ! text[n-i-1]) {result 0;break;}}return Py_BuildValue(i, result); /* i表示一个整数*/}static PyMethodDef PalindromeMethods[] {/* 方法/函数列表*/{is_palindrome, is_palindrome, METH_VARARGS, Detect palindromes},{NULL, NULL, 0, NULL}
};static struct PyModuleDef palindrome
{PyModuleDef_HEAD_INIT,palindrome, /* 模块名 */, /* 文档字符串 */-1, /*存储在全局变量中的信号状态 */PalindromeMethods
};/* 初始化模块的函数*/
PyMODINIT_FUNC PyInit_palindrome(void)
{return PyModule_Create(palindrome);
} setup.py脚本
from setuptools import setup, Extensionsetup(namepalindrome,version1.0,ext_modules [Extension(palindrome, [palindrome2.c])] )如果使用这个脚本运行命令install将自动编译扩展模块palindrome再安装它。
这里没有指定一个模块名列表而是将参数ext_modules设置为一个Extension实例列表。构造函数Extension将一个名称和一个相关文件列表作为参数
如果只想就地编译扩展在大多数UNIX系统中这都将在当前目录中生成一个名为palindrome.so的文件可使用如下命令
python setup.py build_ext --inplace如果安装了SWIG参见第17章可让Setuptools直接使用它 代码palindrome.c的源代码显然比包装后的版本简单得多。能够让Setuptools使用SWIG并直接将其作为Python扩展确实非常方便。 为此需要做的非常简单只需将接口文件.i文件palindrome.i的名称加入到Extension实例的文件列表中即可。
palindrome.c的源代码
#include string.h
int is_palindrome(char *text) {int i, nstrlen(text);for (i 0; I n/2; i) {if (text[i] ! text[n-i-1]) return 0;}return 1;
}
接口文件palindrome.i
%module palindrome%{
#include string.h
%}extern int is_palindrome(char *text);Extension实例的文件列表
from setuptools import setup, Extensionsetup(namepalindrome,version1.0,ext_modules [Extension(_palindrome, [palindrome.c,palindrome.i])])如果用刚才的命令build_ext可能还要加上开关–inplace运行这个脚本也将生成一个.so文件或与之等价的文件但这次无需自己编写包装代码。
这个扩展指定了名称_palindrome因为SWIG将创建一个名为palindrom.py的包装器而这个包装器将通过名称_palindrome导入一个C语言库。
使用py2exe创建可执行程序
py2exe是Setuptools的一个扩展可通过pip来安装它能够创建可执行的Windows程序.exe文件。 py2exe包可用来创建带GUI参见第12章的可执行文件。
print(Hello, world!)
input(Press enter)创建一个空目录再将这个文件hello.py放到这个目录中然后创建一个类似于下面的setup.py文件 beyond.py
from setuptools import setupsetup(nameBeyond,version1.0,descriptionA simple example,authorbeyondyanyu,py_modules[beyond])setup.py
from distutils.core import setup
import py2exesetup(console[beyond.py])接着运行这个脚本
python setup.py py2exe这将创建一个控制台应用程序beyond.exe还将在子目录dist中创建其他几个文件。
有关py2exe的工作原理和高级用法的详细信息可以查阅py2exe官网。
小结
概念解释SetuptoolsSetuptools工具包让你能够编写安装脚本。根据约定这种安装脚本被命名为setup.py。使用这种脚本可安装模块、包和扩展。Setuptools的命令可使用多个命令来运行setup.py脚本如build、build_ext、install、sdist和bdist。编译扩展可使用Setuptools来自动编译C语言扩展并让Setuptools自动确定Python安装位置以及该使用哪个编译器。还可让它自动运行SWIG。可执行的二进制文件Setuptools扩展py2exe可用来从Python程序创建可执行的Windows二进制文件以及其他一些文件可使用安装程序方便地安装。无需单独安装Python解释器就可运行这些.exe文件。在macOS中扩展py2app提供了与py2exe类似的功能。
本章介绍的新函数
函数描述setuptools.setup(…)在脚本setup.py中使用关键字参数配置Setuptools