第十八章 程序打包

第十八章 程序打包

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(name='Beyond',version='1.0',description='A simple example',author='beyondyanyu',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/lib

Setuptools创建了一个名为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 Beyond==1.0 
Finished processing dependencies for Beyond==1.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.h>static PyObject *is_palindrome(PyObject *self, PyObject *args) {int i, n;const char *text;int result;if (!PyArg_ParseTuple(args, "s", &text)) {return NULL;}n=strlen(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(name='palindrome',version='1.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, n=strlen(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(name='palindrome',version='1.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(name='Beyond',version='1.0',description='A simple example',author='beyondyanyu',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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Java中检查对象是否为空?

With the help of "" operator is useful for reference comparison and it compares two objects. 借助“ ”运算符&#xff0c;对于参考比较非常有用&#xff0c;它可以比较两个对象。 "" operator returns true if both references (objects) points to…

android编程从零开始,从零开始学习android开发

博主最近开通了Android栏目&#xff0c;现在正在从零开始学习android&#xff0c;遇到的所有值得分享的知识点以及遇到的问题将发布在这个博客的android栏目下。因为我有着深厚的java底子&#xff0c;所以学习起来得心应手&#xff0c;十分的简单&#xff0c;当然也只能算是入门…

CNN基本步骤以及经典卷积(LeNet、AlexNet、VGGNet、InceptionNet 和 ResNet)网络讲解以及tensorflow代码实现

课程来源&#xff1a;人工智能实践:Tensorflow笔记2 文章目录前言1、卷积神经网络的基本步骤1、卷积神经网络计算convolution2、感受野以及卷积核的选取3、全零填充Padding4、tf描述卷积层5、批标准化(BN操作)6、池化Pooling7、舍弃Dropout8、卷积神经网络搭建以及参数分析2、经…

String.valueOf()

1. 由 基本数据型态转换成 String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 有下列几种 String.valueOf(boolean b) : 将 boolean 变量 b 转换成字符串 String.valueOf(char c) : 将 char 变量 c 转换成…

emacs gdb 调试

写下linux下用emacs调用dgb调试的方法 emacs中使用gdb 说明C等价于ctrl M等价于alt 1,编写 .c函数 test.c 2&#xff0c;gcc一把 看看对不对 带上-g gcc -g -o test .debug test.c 如果要用gdb调试器&#xff0c;必须使用g选项。 3&#xff0c;#ema…

第十九章 趣味编程

第十九章 趣味编程 本章将介绍一些通用的Python编程指南。 为何要有趣 Python有趣的地方之一就是让用户的编程效率非常高效。 极限编程是一种软件开发方法 编程柔术 python的灵活性描述原型设计Python的优点之一是让你能够快速地编写程序。要更深入地了解面临的问题&#…

android按钮在容器下方,使用flex布局解决安卓手机上固定在底部的按钮,在键盘弹起后挡住input输入框的问题...

移动端经常会出现&#xff0c;一个表单里面&#xff0c;确定按钮固定在底部这样的布局&#xff0c;一般会让按钮absolute或者fixed&#xff0c;这样在ios上没有问题&#xff0c;但是在安卓手机上&#xff0c;当表单里面的input输入框获得焦点的时候&#xff0c;按钮会挡在表单上…

dbms支持哪几种数据模型_DBMS中不同类型的数据模型

dbms支持哪几种数据模型资料模型 (Data Model) A data model is a model that defines in which format the data are represented and accessed. Data model mainly defines some of the data elements and relationships that exist between them. 数据模型是定义数据以哪种格…

JS 数组迭代方法

var arr [3,4,5,6,7,"a"]; var isNum function(elem,index,AAA){ return !isNaN(elem);} var toUpperCase function(elem){ return String.prototype.toUpperCase.apply(elem);} var print function(elem,index){ console.log(index"."elem);} /*对数组…

php开源问答_PHP基础知识能力问答

php开源问答This section contains Aptitude Questions and Answers on PHP Basics. 本部分包含有关PHP基础知识的 Aptitude问题和解答。 1) There are the following statements that are given below, which of them are correct PHP? PHP stands for the Preprocessor Hom…

【数据结构基础笔记】【顺序表】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、创建顺序表2、顺序表插入元素3、顺序表删除元素4、顺序表实例分析1、静态2、动态5、顺序表总结前言 本章总结&#xff1a;从静态和动态分别进行顺序表的创建、插入、删除、以及实例分析 1、创建顺序表 1、静态地生成一张…

ubuntu安装oracle unzip: No such file or directory

$ln -s /usr/bin/unzip /你的oracle11安装目录/install/unzip$sudo chmod 777 /usr/bin/unzip转载于:https://www.cnblogs.com/qm4050/archive/2011/08/25/2241466.html

一、网络爬虫概述

1&#xff0c;浏览器与网络爬虫的区别 答&#xff1a; 对于浏览器而言&#xff1a;浏览器打开一个网站&#xff0c;会对网站服务器发送一个request请求&#xff0c;服务器收到该请求之后&#xff0c;会给浏览器一个respond响应&#xff0c;该响应携带很多数据&#xff0c;之后…

百度android广告sdk下载,IS_Freedom

美数广告 SDK接入流程1.嵌入广告SDK将 sdk-android-demo/app/libs 中的 meishu-sdk_xxx_release.aar、open_ad_sdk_xxx.aar、Baidu_MobAds_SDK-release-xxx.aar、GDTSDK.unionNormal.xxx.aar、msa_mdid_1.0.13 拷贝到项目的 libs 下&#xff0c;对应的 build.gradle 文件里面添…

关于《加密与解密》的读后感----对dump脱壳的一点思考

偶然翻了一下手机日历&#xff0c;原来今天是夏至啊&#xff0c;时间过的真快。ISCC的比赛已经持续了2个多月了&#xff0c;我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦&#xff0c;但感觉还是很幸运的&#xff0c;能在大三的时候遇到ISCC&#xff0c;不管怎样&…

java vector_Java Vector elements()方法与示例

java vector向量类elements()方法 (Vector Class elements() method) elements() method is available in java.util package. elements()方法在java.util包中可用。 elements() method is used to get an enumeration of the elements that exist in this Vector. elements()方…

【数据结构基础笔记】【链表】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、链表基础2、创建一个链表3、插入结点4、删除结点5、销毁链表6、实例分析前言 本章总结&#xff1a;链表的定义、创建、销毁&#xff0c;结点的插入与删除 1、链表基础 链表的物理存储结构是用一组地址任意的存储单元存储…

动态添加,删除行之心理测试系统

动态添加&#xff0c;删除行之考试系统 数据库设计&#xff1a; xl_option 题目选项 20090105134755404(编号) 20090105134904421(外键) 比较符合(选项内容) ②(选项标号) 2&#xff08;选项分值&#xff09; xl_subject 题目信息 20090105134943608&#xff08;编号&#xff…

android bitmap裁剪中间,Android裁剪中心位图

虽然上面的大多数答案提供了一种方法来实现这一点&#xff0c;但已经有一种内置的方法来实现这一点&#xff0c;它是一行代码(ThumbnailUtils.extractThumbnail())int dimension getSquareCropDimensionForBitmap(bitmap);bitmap ThumbnailUtils.extractThumbnail(bitmap, di…

二、request请求库

一、requests介绍与安装 1&#xff0c;requests介绍 答&#xff1a;requests是一个优雅且简单的Python HTTP请求库 2&#xff0c;requests作用 答&#xff1a;requests的作用是发送请求获取响应数据 3&#xff0c;requests安装 答&#xff1a;pip install requests 二、…