偶尔用python写点小程序,需要打包成exe,但又不想泄漏源码,于是乎找到了转成pyd再用pyinstaller进行打包,此间踩坑无数,特此记录
1、安装Cython和pyinstaller
将py转成pyd文件需要用到Cython库,打包exe用的是pyinstaller,通过以下命令安装即可
pip install Cython
pip install pyinstaller
2、安装vs
坑1:Unable to find vcvarsall.bat
Pyhon不同的版本需要安装相应的vs才能顺利将py转成pyd,否则会报 “Unable to find vcvarsall.bat” 错误,在令行窗口中直接输入python即可查看安装python信息:
我这里安装的是Python 3.8.0,相应的vs版本是【MSC v.1916】,下面是vs对应版本信息,所以我这里需要安装的是Visual Studio 2017 version 15.9.0 到 Visual Studio 2017 version 15.9.11 这几个中的任意一个版本
Abbreviation | Product name [Visual Studio version] | VC ++ version | _MSC_VER |
---|---|---|---|
2019 Update 5 | Visual Studio 2019 version 16.5.1 | 14.25 | 1925 |
2019 Update 4 | Visual Studio 2019 version 16.4.0 | 14.24 | 1924 |
2019 Update 3 | Visual Studio 2019 version 16.3.2 | 14.21 | 1923 |
2019 Update 2 | Visual Studio 2019 version 16.2.3 | 14.21 | 1922 |
2019 Update 1 | Visual Studio 2019 version 16.1.2 | 14.21 | 1921 |
2019 | Visual Studio 2019 version 16.0.0 | 14.20 | 1920 |
2017 Update 9 | Visual Studio 2017 version 15.9.11 | 14.16 | 1916 |
2017 Update 9 | Visual Studio 2017 version 15.9.7 | 14.16 | 1916 |
2017 Update 9 | Visual Studio 2017 version 15.9.5 | 14.16 | 1916 |
2017 Update 9 | Visual Studio 2017 version 15.9.4 | 14.16 | 1916 |
2017 Update 9 | Visual Studio 2017 version 15.9.1 | 14.16 | 1916 |
2017 Update 9 | Visual Studio 2017 version 15.9.0 | 14.16 | 1916 |
2017 Update 8 | Visual Studio 2017 version 15.8.0 | 14.15 | 1915 |
2017 Update 7 | Visual Studio 2017 version 15.7.5 | 14.14 | 1914 |
2017 Update 7 | Visual Studio 2017 version 15.7.3 | 14.14 | 1914 |
2017 Update 7 | Visual Studio 2017 version 15.7.2 | 14.14 | 1914 |
2017 Update 7 | Visual Studio 2017 version 15.7.1 | 14.14 | 1914 |
2017 Update 6 | Visual Studio 2017 version 15.6.7 | 14.13 | 1913 |
2017 Update 6 | Visual Studio 2017 version 15.6.6 | 14.13 | 1913 |
2017 Update 6 | Visual Studio 2017 version 15.6.4 | 14.13 | 1913 |
2017 Update 6 | Visual Studio 2017 version 15.6.3 | 14.13 | 1913 |
2017 Update 6 | Visual Studio 2017 version 15.6.2 | 14.13 | 1913 |
2017 Update 6 | Visual Studio 2017 version 15.6.1 | 14.13 | 1913 |
2017 Update 6 | Visual Studio 2017 version 15.6.0 | 14.13 | 1913 |
2017 Update 5 | Visual Studio 2017 version 15.5.7 | 14.12 | 1912 |
2017 Update 5 | Visual Studio 2017 version 15.5.6 | 14.12 | 1912 |
2017 Update 5 | Visual Studio 2017 version 15.5.4 | 14.12 | 1912 |
2017 Update 5 | Visual Studio 2017 version 15.5.3 | 14.12 | 1912 |
2017 Update 5 | Visual Studio 2017 version 15.5.2 | 14.12 | 1912 |
2017 Update 4 | Visual Studio 2017 version 15.4.5 | 14.11 | 1911 |
2017 Update 4 | Visual Studio 2017 version 15.4.4 | 14.11 | 1911 |
2017 Update 3 | Visual Studio 2017 version 15.3.3 | 14.11 | 1911 |
2017 Update 2 | Visual Studio 2017 version 15.2 | 14.10 | 1910 |
2017 Update 1 | Visual Studio 2017 version 15.1 | 14.10 | 1910 |
2017 | Visual Studio 2017 version 15.0 | 14.10 | 1910 |
2015 Update 3 | Visual Studio 2015 Update 3 [14.0] | 14.0 | 1900 |
2015 Update 2 | Visual Studio 2015 Update 2 [14.0] | 14.0 | 1900 |
2015 Update 1 | Visual Studio 2015 Update 1 [14.0] | 14.0 | 1900 |
2015 | Visual Studio 2015 [14.0] | 14.0 | 1900 |
我这里已下载好2017的,如有需要可以直接取:链接: https://pan.baidu.com/s/1VRMwwtWGlUZLfPDcmW48ng 提取码: yd9e
这里有两个文件需要安装,先安装 vs_professional__2017.exe,再安装 visualcppbuildtools_full.exe
下图为安装vs_professional__2017.exe界面,这里直接点击右下角的安装即可,其他的不用勾选
3、转pyd
创建一个setup.py,内容如下:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize(["add.py"]), # add.py 为需要打包的文件名,不能包含中文
)
在令行窗口中输入以下命令来生成pyd文件:
python setup.py build_ext --inplace
按回车后,会生成 add.cp38-win_amd64.pyd,修改文件名为add.pyd,即删除多的【.cp38-win_amd64】
注意:因系统不同这一部分可能不一样
4、打包exe
坑2:ValueError: script ‘C:\Users\de\Desktop\add\add.pyd’ not found
创建引导文件 index.py,这里面需要import引用的模块,如果直接打包pyd文件会报错:【ValueError: script ‘C:\Users\de\Desktop\add\add.pyd’ not found】
index.py 内容如下,除了引用的内容外,还要import生成的add.pyd文件
import urllib.request
import http.cookiejar
from urllib import parse
import json,yagmail,datetime
import tkinter as tk
from tkinter.filedialog import *
import add #注意修改为自己的文件名
最后通过以下命令进行打包:
pyinstaller.exe -Fw .\index.py -i .\ico\f.ico
pyinstaller参数说明:-Fw,是创建单个exe文件,并隐藏命令行窗口,-i是指定ico图片
坑3:ico图标不生效
pyinstaller经常在打包时会发现ico不生效,这是因为exe需要多个尺寸的ico文件,我的ico目录中32X32,48X48和64X64的3个尺寸,只需指定其他一个文件名即可
以此记之,慢慢填坑路