使用cx_Freeze打包详细介绍
本文最后更新于 411 天前,其中的信息可能已经有所发展或是发生改变。

最近发布的msi版本一直都是用Cx_Freeze打包的,效果还真的不错。

打包有很多种方式:
可以打包成msi,也可以打包成一个zip,还可以打包成单个的exe(在没有tkinter的情况下,貌似GUI库都不行)
还支持打包成rpm,app之类的格式,但是那两个我都没有用过,貌似有一个是支持MAC的。

cx_Freeze下载:

1. pip install cx_Freeze
2. 在这里下载 : cx_Freeze 4.3.4 : Python Package Index
然后还是使用pip install 目录/文件.whl

wheel文件就要用pip装,我拿wheel装numpy.whl,报错,pip却装好了

安装之后,打包之前,你需要写一个setup.py
以下是我的版本:

import cx_Freeze
import sys
import traceback

base = None

if sys.platform == "win32":
    base = "Win32GUI"

bdist_msi_options = {
    "upgrade_code": "{#去网上生成一个固定的GUID,就不要变了}"
    }

executables = [cx_Freeze.Executable(u"#这里替换成你软件源代码位置",base=base,icon=#"这里替换成图标位置",shortcutName="#这里替换成你软件名称",shortcutDir="#你想要创建的位置(以下有介绍)")]

cx_Freeze.setup(
    name = u"#这里替换成你软件名称",
    options = {"bdist_msi" : bdist_msi_options, 
    "build_exe" : {"packages":[#"这里替换成你软件依赖的库"],
    "include_files" : [#"这里替换成图标位置"],
    "optimize" : 2
    }},
    version = "#这里替换成你软件版本",
    description = "#这里替换成你软件名介绍",
    executables = executables,
    author = "#这里替换成你软件作者"
)

来分别解释一下:

  • base:指的就是你软件的运行方式,我这里因为有tkinter做的GUI,所以是Win32GUI,经试验,如果你要是没有GUI而用了Win32GUI会报错
    optimise:0指的是不优化,1指的是优化,2是更优化(其他我没感觉出来,只是优化过后体积小一些)
  • version:版本号
  • description:软件的介绍,在鼠标悬停时会显示,别写太长
  • author:作者是谁,信息
  • upgrade_code:在打包msi填写这个,就可以启用升级安装,但是这个就不要变了
  • shortCutName:在指定位置创建的快捷方式的名称
  • shortCutDir:这个是MSDN的介绍,自己选取:http://msdn.microsoft.com/en-us/library/aa370905(v=vs.85).aspx#System_Folder_Properties
    bdist_msi仅在打包msi时有效!
zip软件
msi
  • 生成软件:cmd切换到setup.py目录下,运行 python setup.py build
  • 生成msi:cmd切换到setup.py目录下,运行 python setup.py bdist_msi

但是在打包完了之后发现有很多问题,在这里一一列举一下:

Python位置
在软件位置

关于目录的问题

有一个很奇怪的问题,在Python中,sys.path返回的一个列表中,第一个是脚本所在位置
而在打包好之后,则变成了脚本的绝对路径(目录变成了第二个):
所以记得把sys.path[0]改成sys.path[1]才可以获取目录路径

关于依赖的库问题

有时候你觉得已经不需要在setup.py中使用includes包含库,那么你就错了,cx_Freeze对于很多库默认是没有包涵的,而为了确保发布的软件能顺利地使用包,我的建议是:
把你所有要用的库全写进includes里,如果运行时还是出现找不到的问题,就把库中依赖的另外的库也根据需求引入
什么意思呢?

dbm

我的软件用了shelve存储数据,然后我import shelve,可是在includes中包含之后仍然用不了shelve
在去掉源代码中try之后,你会发现有这样的错:

于是你发现在shelve.py中,第222行,它引入了dbm,所以你要在includes中再加一个dbm
是不是很麻烦,但是这种情况相对来说并不多,所以手工量不很大

不要问我为什么,最好引入一下traceback否则又会有很多奇妙的问题出现。

但是说真的,cx_Freeze的打包还真是很全面的。

大家一定要多多支持我的软件啊!写代码不容易的~

被攻击了

昨天网站被攻击了:中午发生了什么,我不知道,但是我给百度站长平台管理员发的邮件他没有给我回,这也是意料之中吧。

评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇