pipenv创建虚拟环境,并用Pyinstaller 打包流程
背景
最近由于需要经常切换DNS,就用python做了个小工具,程序中用到了pywin32, wmi, tkinter, 虚拟环境用pipenv,并用pyinstaller打包,最后用mt.exe添加UAC权限,在此将打包过程写下来
1. 用pipenv创建python3.6.6虚拟环境
创建固定版本python虚拟环境需要先在本机安装该版本,并添加到系统环境变量(下面的命令均在windows下的powershell执行):
- 安装pipenv
pip install pipenv
- 在干净目录下初始化python环境, 系统会自动在环境变量里搜索符合要求的python环境
pipenv --python 3.6
- 进入虚拟环境(第一次进入会自动进行安装 pipenv install)
pipenv shell
- 退出虚拟环境
exit
- 进入虚拟环境内,通过pip安装程序依赖(期间32位python3.4环境下安装pywin32一直失败,后来换成64位python3.6成功,具体原因还未探究,有可能本人使用的阿里pip服务,未找到相应的包)
pip install wmi
pip install pywin32
pip install pyinstaller
这里安装不太规范,应该使用pipenv install packagename, 这样会把依赖包写入当前虚拟环境目录中的Pipfile, 方便我们开发完成后的部署
Pipfile详细描述:[https://blog.windrunner.me/python/pip.html]
更多pipenv参数介绍:[http://blog.51cto.com/1840558/2073283]
2. 在虚拟环境内通过pyinstaller打包
步骤简单,参数较多,如:用dnstool.py的单个python代码,生成以logo.ico为图标的单个exe窗体应用。
pyinstaller -F -w -i logo.ico dnstool.py
打包参数:
- -F 打包成单个exe文件,如果没有-F参数,则放在代码同名的文件夹内
该参数有可能导致你的应用在不同环境下发生兼容问题,而将依赖打包在同一文件夹下的方式兼容性更强 - -w / -c 打包成窗体应用,还是 控制台应用
- -i icon.ico 添加默认图标, 多个png生成单个ico文件工具 ,不过不同windows系统下图标有兼容问题,懒得详细探究了
参考1
官方文档
添加管理员权限启动(UAC)
- 在生成后的exe跟目录创建一个后缀为 .manifest 具有相同exe名的文件,将下面代码写入
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="myapp.exe.manifest"
type="win32"
/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
- 也可以将 manifest 文件写入exe,适合单个文件的应用
- 工具mt.exe的文件位置:
C:\Program Files (x86)\Windows Kits\10\bin\x64\mt.exe
- 用cmd命令进入mt.exe 文件根目录,通过如下命令将manifest文件写入exe中
mt -manifest D:\Git\Python\pipenv3.4\dist\dns.exe.manifest -outputresource:D:\Git\Python\pipenv3.4\dist\dns.exe;1
写入成功后可以发现我们的exe文件图标上多了个盾牌
参考:通过添加manifest文件,使启动应用时弹出UAC窗口