使用 cx_Freeze 编译 Python script 成可执行档(.EXE)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leewc6734/article/details/86645056

早先都使用 pyinstaller 进行 Python Script 打包成单一 Exe,但最近不得不放弃使用,
其原因在于编译后的档案几乎 100% 的机会会被 Windows 上的防毒软体判定为病毒,
有一说是因为 pyinstaller 使用了其自备的 bootloader,故当执行编译后的 Python exe 档案
其行为将会被多数 Windows 上的防毒软体所阻挡并删除...

原想放弃,但不打包 Python 将会遇到更多意想不到的问题,好在有一个替代方案并且经测试后确实比
pyinstaller 好用,但其编译后的 Python script 有较多档案并且你的 Python Module 也仅会被
编译为 .pyc 的档案。

最终档案运作环境为 Windows,故使用 Windows 10 Pro 为编译时的平台,使用 Python 3.7.2 x64,
但会发生无法直接使用官方网站所说的 python -m pip install cx_Freeze --upgrade 指令安装,
但在 stackoverflow 的问题回答中改为使用 Python 3.6 x32 版本就可以顺利安装,我想又是跟系统位元数有关,
不过老子就是要用 x64,所以以下将改为使用 Wheel 的方式进行安装。

安装环境:
1. Windows 10 Professional (Running on VMware)
2. Python 3.7.2 x64
3. cx_Freeze 5.1.1
4. Wheel

安装方式:
1. 安装 Python 3.7.2 x64,并增加一个 PYTHONSTARTUP 变数,变数值为:<Python 的安装绝对路径> 至系统环境变数中,
   这只是我遇到问题时发现有人新增了这个变数后让一些灵异问题减少,所以多设一次也没差就"射"吧!

2. 开启命令提示字元(Command-Line)使用 pip 安装 Wheel
   # pip install wheel

3. 到以下网址下载相对应的 Wheel - cx_Freeze 档案,对应的档案名称为:
   cx_Freeze‑5.1.1‑cp37‑cp37m‑win_amd64.whl
   务必使用与自己 Python 版本相对应的 wheel 档
   https://download.lfd.uci.edu/pythonlibs/r5uhg2lo/cx_Freeze-5.1.1-cp37-cp37m-win_amd64.whl

4. 安装 cx_Freeze
   # pip install cx_Freeze‑5.1.1‑cp37‑cp37m‑win_amd64.whl

5. 就酱!这样就安装好所需要的环境了,接下来就是编译的方式说明,cx_Freeze 会帮你将所需要的 Module 都打包在一起,
   所以若你没有遵守或了解 Python 的 Module 定义,那就发生一堆的 ModuleNotFoundException ...等问题,
   所以建议要打包前,先确认你的 Python Module 都已经设定正确。
   
   检查项目:
   * 每个目录下是否都已经有空白的 __init__.py 告知 Python 使用该目录为 Package
   * 各 *.py 的 import 语法是否正确?

6. 接下来切换到你的 script 根目录,也就是 main 的那个 *.py 档所在
7. 执行 <Python 安装路径>\Script\cxfreezes-quickstart 让 cx_Freeze 帮你进行编译前的相关设定,这个动作会由 cx_Freeze
   以交谈方式帮你建立编译用的 setup.py 档案,稍后在编译时将会使用到。
   # python <Python 安装路径>\Script\cxfreezes-quickstart

8. 接下来的问题,就一对一对答拉~
   # Project Name:      <目前专案名称>
   # Version[1.0]:      <目前专案版本>
   # Description:       <目前专案描述>
   # Python file to make executable from:       <目前专案版本>
     -> 这个问题重要拉~请详细指明你主要启动的 *.py 档案名称,他会由此出发将所需要的 Module 一并编入,
        也就是说,设定错误虽然可以编译完成,但是,连结 module 档案时都将会出错。

   # Executable file name:      <最终可执行档案的名称>
   # (C)onsole application, (G)UI application, or (S)ervice [C]:     <程式类型>
     -> 建议依照你的 Python 专案类型而定义,应该是编译时会载入不同的 Python Library

   # Save setup script to [setup.py]:       <是否储存编译专案用的设定档>
   # Setup script written to setup.py; run it as:
         python setup.py build
     Run this now[n]?                       <设定档储存位置以及将会执行编译的指令>

9. 按下 "Y" 后,cx_Freeze 就会开始编译档案,编译完成后即可以在同目录下的 build 资料夹找到编译后的相关档案。
10. 记得!要发布给他人使用时必须要把整个 build 目录内的档案一并交付,以免重要的档案遗失导致无法顺利运作。

就酱!好好用吧

猜你喜欢

转载自blog.csdn.net/leewc6734/article/details/86645056