实验环境:
- Python-3.5.1-amd64
- 操作系统:Windows 10
- exe发布工具:cx-Freeze 5.1.1
一、创建虚拟环境
- 新建虚拟环境:
virtualenv VTrans --always-copy --unzip-setuptools
- 复制 tcl 到虚拟环境
tcl要放到Lib的同级目录下,因为Python默认读取这个位置。
例:把 D:\SDKs\Python35\tcl\ 复制到 G:\Workspace\Venvs\VTrans\tcl\
(额外补充一点,我在Win7+Py3.6下测试,tcl会自动复制过去) - 复制 tcl86t.dll 和 tk86t.dll 到虚拟环境
我是把整个DLLs目录都复制到了Scripts下面。这个的位置没有限制,其实不复制也没关系,开发阶段不需要它。我只是为了保持发布脚本中路径的统一才做了这个处理。
例:把 D:\SDKs\Python35\DLLs\ 复制到 G:\Workspace\Venvs\VTrans\Scripts\DLLs\
二、编写发布脚本
import sys
import os
from os import path
from cx_Freeze import setup, Executable
exe_path = path.dirname(path.abspath(sys.executable))
cur_path = path.dirname(path.abspath(__file__))
base = None
if sys.platform == 'win32':
base = 'Win32GUI'
tcl_path = path.abspath(path.join(exe_path, '..', 'tcl'))
if not path.isdir(tcl_path):
tcl_path = path.join(exe_path, 'tcl')
if not path.isdir(tcl_path):
print('找不到tcl路径!!')
tcl_path = False
if tcl_path:
os.environ['TCL_LIBRARY'] = path.join(tcl_path, 'tcl8.6')
os.environ['TK_LIBRARY'] = path.join(tcl_path, 'tk8.6')
setup(name='DTrans',
version='0.1',
options={
'build_exe': dict(
# 打包需要包含的package
packages=[
'queue', 'idna.idnadata'
],
# 打包需要包含的文件
include_files=[
path.join(exe_path, 'DLLs', 'tcl86t.dll'),
path.join(exe_path, 'DLLs', 'tk86t.dll'),
],
)},
executables=[
Executable(script='main.py', base=base, targetName='执行.exe')
])
发布命令
(VTrans)> python setup.py build
三、杂记
cx-Freeze并没有帮我们把所有依赖项都打包出去,据网料记载间接依赖cx是识别不出来的,因此就需要我们自己在发布脚本里添加上去,也就是上面packages和include_files里做的工作。
打包的时候,很难明确哪些东西cx处理了,哪些需要自己添加。解决这个问题,只需遵循“缺啥补啥”原理。
具体操作就是:发布&运行 => 查看报错 => 添加依赖项
网友评论