第十八章 程序打包

第十八章 程序打包

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.pswp.cn/news/378247.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378247.shtml
英文地址,請注明出處:http://en.pswp.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 二、…