1.Cython 安装 (将py编译成pyd,避免反编译)、pyinstaller 安装
pip install cython
pip install pyinstaller
2.cython使用
建立编译脚本
#!/usr/bin/python
# -*- coding: utf-8 -*-
# build_pyd.py
#
# Copyright (C) 2019 - xulong
#
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = 'any words.....',
ext_modules = cythonize(["HongshangWeixinHelper.py","WeiXin_App_Helper.py",
]
),
)
执行编译脚本:
python build_pyd.py build_ext --inplace
问题就出在执行脚本这了,因为 cython 的编译是 把python脚本转为 C++ 代码,然后用c++编译器来编译的,所以前提系统要有c++编译器可调用。否则会报错,缺少 vcvarsall.bat 文件。
我安装了 Visual C++ Build Tools 2015(不想装ide,太大了,因此后面还要付出很多尝试),再执行上面命令,报缺少 cl.exe文件,这个应该是找不到路径问题,找到 cl.exe 所在目录,把它 加到环境变量 path 里。后面还会一直报缺少各种 .h 文件,.lib文件,这都是vc++编译时和链接时要用到的头文件和库文件。如果是IDE,会在项目里配置这些的。
找到python的编译配置文件 C:\Python37\Lib\distutils\msvc9compliler.py 里面看到,它大概也就是从各地找到相应的文件目录来组成 编译命令的。
看它用到了系统的环境变量include 和 lib ,那我这就简化,把需要的 .h 头文件的目录 都加入 include 环境变量,把需要的.lib 目录都加入 lib 环境变量里。然后不断去试,缺了就加就行了。(参考:https://docs.microsoft.com/en-us/cpp/build/setting-the-path-and-environment-variables-for-command-line-builds?view=vs-2017  CL 确实是需要配置相应的环境变量的。)
后面能正常把 py 编译成 pyd 文件了。 pyd 文件相当于 dll 文件, 使用时在 .py 文件里把它当模块引入。
3.使用pyinstaller 打包。
pyinstaller HongshangWeixinHelper.spec
Pyinstaller 有bug ,在处理中文路径名时有问题。
#HongshangWeixinHelper.spec 文件格式如下:
a = Analysis(['main1.py'],
pathex=[],
binaries=[],
datas=[('icon.ico', '.'),('cacert.pem','.')],
hiddenimports=['wx','xlrd','WeiXin_App_Helper','json','requests','time'], #当用了cython 转为pyd模块里的引用,不会自动打包进来,需要在这添里
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
#注: 这种模式是将脚本打包到exe,其它文件做为单独文件,供exe调用,形成一个目录。
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='HongshangWeixinHelper',
debug=False,
strip=False,
upx=True,
console=False )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='wxgzt')
#注: 这种模式是将所有文件打包到exe,exe执行时会释放其它文件到临时文件夹,以供调用。
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='HongshangWeixinHelper',
debug=False,#True可以看到误提示
strip=False,
upx=True,
console=False , #True可以看到cosole
icon='icon.ico')
--------------------------------------------------------------------------------------------------------------------------------------------
我的环境变量设置 (只在命令行测试,常用的话还是加至系统环境变量去):
set PATH=%path%;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files (x86)\Windows Kits\8.1\bin\x64\;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\
set include=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\;C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt;C:\Program Files (x86)\Windows Kits\8.1\Include\shared\
set lib=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64\;C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64\
我的python版本:
D:\2.DEVELOP\python\HongshangWeixinHelper.py3>python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
MacOS 下安装:
直接用 pyenv 装 python
env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.8.0
cython 和 pyinstaller 在相应的虚拟环境下直接用 pip install
PS: mac pyenv install python 时一定要加上 env PYTHON_CONFIGURE_OPTS="--enable-framework", 否则会有很多坑,pyinstall可能打包了就是不能运行, wxpython 应用下面报错
This program needs access to the screen. Please run with a
Framework build of python, and only when you are logged in
on the main display of your Mac.
国内的几个Python镜像下载地址:
https://pypi.tuna.tsinghua.edu.cn/simple
http://mirrors.aliyun.com/pypi/simple/
http://pypi.douban.com/simple/
https://mirrors.ustc.edu.cn/pypi/web/simple/
使用pip通过镜像安装第三方库的方法:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller