为什么使用pyd?为了保护py源代码。
本文要解决的问题是什么,就是生成一个可以在xp 32位以及win7 及64位,win10 64位,windows主流平台都可以正常运行的 独立发行包。
环境要求:
python版本:3.4.3(32位)是最后一个支持xp的版本。
cython版本,0.29.14最新(2020年时可用)
pyinstaller版本,3.5
{更正:并不需要安装vs2005的包。2020-02-03}
//vcredist.msi vs2005(运行时包)即使你是64位的win7或是win10也要安装,否则提示安装不正确(指的是vc包,或是提示 并行的 XXX)
关于pyd的编译。本身利用cython的通用方法,编译本身没有什么神秘。
前期需要搞定的就是 vcrsall.bat的查找问题。这个网络上有很多,就不多说。
vs2008,在xp上还有很多细节。一是正版化cdkey(无难度)
后面的工作:
1.使用 cython编译,会出现 basestd.h找不到,我的办法就是全盘搜索然后硬复制到python 3.4的include目录下。
2.kernl32.lib找不到,复制到 python3.4的libs下(是libs不是lib),遇见什么解决什么。
cl.exe找不到,这里需要 path= cl.exe 的实际目录 ;%path%
多运行几次就可以编译了。
为什么使用vs2008,为了兼容性,原来使用的cpp tools,结果带了一大堆的sdk,而这些在xp根本安装不上。
综上所述,我们为了减少依赖,使用的是msvcr90.dll
在pyinstaller中,我们使用 -D参数打包成一个目录,因为如果-F的话,如果生成的exe比较大的话,每次有一个解压流程,200多M的话,对于配置低的机器来说过于缓慢。
XP上的运行,会发现pyd模块无法import
import error : dll 无法加载。
![d80838fc2d37c2d9ee6b73ec4ac131cc.png](https://i-blog.csdnimg.cn/blog_migrate/bd598fd7bf176696e2a2b0ff3d499aeb.png)
上面的错误是我自己的代码捕捉的。
try
dll包的引入
这时我们需要将
msvcm90.dll
msvcp90.dll
msvcr90.dll
Microsoft.VC90.CRT.manifest
打包到 目录中,也可以复制到目录中
但是还是不能运行。
提示的是 c++ runtime 载入错误。R6034。
![24d0ff61de81d76bc6c5468c5a23ff52.png](https://i-blog.csdnimg.cn/blog_migrate/41d022b0a7f3bc03f1e4d9d4925e7bab.png)
这是因为pyinstaller打包来的是manifest在使用了cython编译的pyd,必须要覆盖一下原程序名称.exe.manifest
**我们只需要将Microsoft.VC90.CRT.manifest,再复制一份,改名为上面文件。而原来的也绝不能删除。**
切记!切记!此步骤是要pyinstaller -D生成的目录下,手工操作的。
完成上面所有的步骤后,xp,win7,win10下正常运行 vs2008编译的pyd,无视 32或是64位。
如果对你有帮助,希望可以关注我,并为我点赞。
python路上慢慢的探索,有缘的人得之。