Python学习笔记_第十八章:程序打包

用于发布Python包的工具包Distutils能让程序员轻松地用Python编写安装脚本。这些脚本可以用来发布存档文件等。

Distutils基础

Distutils
如下为一个简单的安装脚本(setup.py)

from distutils.core import setup
setup(name = 'hello',
    version = '1.0',
    description = 'A simple example',
    author = 'hcs',
    py_modules = ['hello'])

setup函数中不一定得提供所有信息(可以不提供任何参数),也可以提供更多(author_email或者url)的参数
setuptools是建立在Distutils基础上的,包含一些增强功能,例如可以生成Python蛋,即用于发布Python包的可携带】单文件捆绑版本。还提供很多与Python package Index自动交互的功能。
安装Python模块、包和扩展的标准机制:

  • 准备hello.py(包、扩展)
  • 在同一目录下编写安装脚本(setup.py)
  • 执行:python setup.py build,输出如下:


    result
  • 执行:python setup.py install,输出如下:
    result

    上例中我们只使用了py_module指定,如果想要安装整个包的话,可以使用类似的方式执行packages指令。还能为Distutils创建配置文件,以设置各种属性。详情
    提供选项可以指定安装什么程序以及在哪安装,方法有:命令行选项开关、setup函数中的关键字参数以及Distutils的配置文件。

打包

写完setup.py脚本以后,就可以用它来建立存档文件,windows安装程序和RPM包。

建立存档文件

使用sdist命令
执行Python setup.py sdist命令,结果如下:


result

此时根目录下的结构是这样的:


根目录结构

现在就可以将dist下的hello-1.0.zip发布给其他人,利用内置的setup.py解包并安装。dist中的压缩包格式可以设置,通过--formats设定。Python2.5内置的格式有:bztar、gztar、tar、zip(windows中默认的)和ztar。

创建Windows安装程序和RPM包

使用bdist命令可以创建单一的Windows安装程序和Linux RPM文件,bdist的可用格式有rpm和wininst。
执行 python setup.py bdist --formats=wininst 结果如下:


result

有意思的是在非windows OS也可以为程序包建立windows安装程序,前提是没有任何需要编译的扩展。
使用真正的安装程序
如果想要更加专业的安装界面(尤其用py2exe生成可执行程序时)可以考虑使用一些标准的安装程序,例如:Inno Setup它和py2exe所创建的可执行文件配合相当好,并且提供一般的安装体验,有卸载功能。
更Python化,使用McMillan installer,可以代替py2exe。其他的选择有:InstallShieldWiseinstallerInstaller VISENullsoft Scriptable Install System、Youseful Windows Installer和Ghost Installer

编译扩展

from distutils.core import setup, Extension
setup(name = 'palindrome',
      version = '1.0',
      ext_modules = [Extension('palindrome', ['palindrome2.c'])])

执行:python setup.py build_ext --inplace,结果如下:


result

如果安装了SWIG,Distutils可以直接调用它,安装脚本如下:

from distutils.core import setup, Extension
setup(name = 'palindrome',
      version = '1.0',
      ext_modules = [Extension('palindrome', ['palindrome.c', 'palindrome.i'])])

执行:python setup.py build_ext --inplace,结果如下:

result

上面结果中报:fatal error LNK1120: 1 unresolved externals错误,未解决。
如果报:''error: Unable to find vcvarsall.bat''错误,解决方案如下:
https://blog.csdn.net/yuer158462008/article/details/68957646

使用py2exe创建可执行程序

py3exe作为Distutils的扩展(可在http://www.py2exe.org上获得)。可以用来生成Windows的可执行程序(.exe文件,Distutils的sdist命令也生成了.exe文件),如果不想让用户单独安装Python解释器的话,它就大显神威了。
生成可执行文件后可能还需要一个安装程序,如Inno Setup(http://jrsoftware.org/isinfo.php),来发布可执行程序及py2exe生成的附加文件。
一个例子
hello.py:

print 'hello, world'
raw_input("Press <enter>")

setup.py:

from distutils.core import setup
import py2exe
setup(console = ['hello.py'])

执行python setup.py py2exe,结果如下:

C:\Users\hcs\Desktop\py2exe>python setup.py py2exe
running py2exe
creating C:\Users\hcs\Desktop\py2exe\build
creating C:\Users\hcs\Desktop\py2exe\build\bdist.win-amd64
creating C:\Users\hcs\Desktop\py2exe\build\bdist.win-amd64\winexe
creating C:\Users\hcs\Desktop\py2exe\build\bdist.win-amd64\winexe\collect-2.7
creating C:\Users\hcs\Desktop\py2exe\build\bdist.win-amd64\winexe\bundle-2.7
creating C:\Users\hcs\Desktop\py2exe\build\bdist.win-amd64\winexe\temp
creating C:\Users\hcs\Desktop\py2exe\dist
*** searching for required modules ***
*** parsing results ***
creating python loader for extension 'unicodedata' (D:\Program Files\Python2.7\DLLs\unicodedata.pyd -> unicodedata.pyd)
creating python loader for extension 'select' (D:\Program Files\Python2.7\DLLs\select.pyd -> select.pyd)
creating python loader for extension '_hashlib' (D:\Program Files\Python2.7\DLLs\_hashlib.pyd -> _hashlib.pyd)
creating python loader for extension 'bz2' (D:\Program Files\Python2.7\DLLs\bz2.pyd -> bz2.pyd)
*** finding dlls needed ***
*** create binaries ***
......
*** copy dlls ***
copying C:\WINDOWS\system32\python27.dll -> C:\Users\hcs\Desktop\py2exe\dist
setting sys.winver for 'C:\Users\hcs\Desktop\py2exe\dist\python27.dll' to 'py2exe'
copying D:\Program Files\Python2.7\lib\site-packages\py2exe\run.exe -> C:\Users\hcs\Desktop\py2exe\dist\hello.exe

*** binary dependencies ***
Your executable(s) also depend on these dlls which are not included,
you may or may not need to distribute them.

Make sure you have the license if you distribute any of them, and
make sure you don't distribute files belonging to the operating system.

   USER32.dll - C:\WINDOWS\system32\USER32.dll
   SHELL32.dll - C:\WINDOWS\system32\SHELL32.dll
   ADVAPI32.dll - C:\WINDOWS\system32\ADVAPI32.dll
   WS2_32.dll - C:\WINDOWS\system32\WS2_32.dll
   GDI32.dll - C:\WINDOWS\system32\GDI32.dll
   KERNEL32.dll - C:\WINDOWS\system32\KERNEL32.dll

编译后根目录为:

root

dist目录为:
dist

双击或在命令行都可以运行hello.exe,命令行结果如下:
result

关于py2exe如何工作以及如何以更高级的方法使用它的信息,都可以在py2exe的网站(http://www.py2exe.org)上找到。
就想也怕巷子深
新的软件可以在很多网站上声明,例如Freshmeat(http://freshmeat.net)。但还有一个叫做Python Package Index(PyPi)的Python包集中主页可供选择。
Distutils命令:可以使用如:build、build_ext、install、sdist和bdist。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,622评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,716评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,746评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,991评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,706评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,036评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,029评论 3 450
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,203评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,725评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,451评论 3 361
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,677评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,161评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,857评论 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,266评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,606评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,407评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,643评论 2 380

推荐阅读更多精彩内容