美文网首页
window下利用visual studio和cython编译p

window下利用visual studio和cython编译p

作者: leoatchina | 来源:发表于2020-05-09 17:13 被阅读0次

    需求

    要写一个数据处理的小程序,对输入的excel文件进行少许处理后从长ID转成宽ID后再保存,用pandas很容易解决这个问题,但要打包成有gui界面的exe文件在windows下使用。

    一般能找到的教程是用pyinstaller,但这样打出来的文件或文件夹巨大无比而且动不动报错。还有用py2exe, cz_freeze等方法,但是试了下也不能解决我的问题。

    以前在linux系统下有过批量py文件为so以加密py文件的经验,那在windows下,可能也有类似的方法去解决打包需求。

    学习网上资料后,准备用cython把py文件编译成c文件,然后再用visual studio里的cl.exe编译成exe文件。

    环境

    • Python3, 装在C:\Anaconda3
    • 安装cython, pyqt5, pandas
      • 为了控制最后的压缩包大小,可以conda create一个环境再去打包,不过我没有搞
    • vs2017: 装在C:\Program Files (x86)\Microsoft Visual Studio\2017
    • PATH按常规,加入相应的路径,但是注意没有设置PYTHONHOME, PYTHONPATH等变量。

    Cython转换源py文件为.c文件

    cython -3 .\longID2wide.py --embed
    

    会生成一个 longID2wide.c文件

    用vs 2017的cl.exe打包成exe文件

    cl.exe要在系统PATH, 当然你写绝对路径也行

    cl  -I"C:\Anaconda3\include" -I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt"  -I"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.16.27023\include" -I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared" /Tc longID2wide.c /link /OUT:"C:\L2W\l2w.exe"  /LIBPATH:"C:\Anaconda3\libs" /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.16.27023\lib\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt\x64" /ENTRY:"wmainCRTStartup"  /MACHINE:X64 /SUBSYSTEM:windows
    

    注意点(重要!!):

    • -I后是.h头文件的目录,/LIBPATH.lib文件的目录,相应要放入到系统变量PATH,或者如同我一样在编译时指定。
    • 建议装个everything,如果系统提示你缺少xxxxx.hxxxx.lib,去vs2017python的目录,以及其他可能的相关目录下搜索。
      • 上面的命令就是提示少什么文件,然后我用everything去找再加入到命令行中去
    • 生成的exe对像为 /link /OUT:"C:\L2W\l2w.exe", 260k左右大小

    测试

    此时去运行这个文件,很有可能会出现如下问题

    Fatal Python error: Py_Initialize: Unable to get the locale encoding
    ImportError: No module named 'encodings'
    

    如何解决?按照网上的做法,在系统里设置PATHONHOME,指向C:\Anaconda3目录,程序能正常工作。

    打包

    但是,如上,把这个exe文件发给一个没有python环境的人,仍然不能运行?这是什么原因?

    原因是,python本身是一个解释型的语言,其运行要依赖于在系统里安装的python基础包和安装上的包,或是动态链接库。在没有PYTHONHOME情况下,自然不能运行。

    那如何解决?仔细一想,其实大部分win32程序找动态依赖库,首先是从当前目录下找,然后再去系统路径里找,因此把这个exe文件放入到一个有python环境的目录就有可能解决问题。
    因此,我把C:\Anaconda3\envs\py37目录下的东西整个复制到C:\L2W,此exe文件就可正常运行!!

    精减

    这个C:\py3里面还有多文件,能不能删除?经过我实践后发现根目录下,仅需要保留python37.dll文件,DLLsLib文件夹,就可正常运行。

    其实上述文件夹下还可以进一步删除文件,但是搞不好删掉一个文件或文件夹,编译而成的exe文件无法运行。而且,实现我代码功能的pandas,nunpy, pyqt5包本身就很大(50m,50m,130m),删除一些周边的小文件或文件夹对精减没有太大意义,因此就不用花太多时间去测试极限运行依赖性。

    有点卸磨杀驴的是, Lib/site-packages下的Cython文件夹是可以删除的,毕竟运行时用不到编译工具。

    相关文章

      网友评论

          本文标题:window下利用visual studio和cython编译p

          本文链接:https://www.haomeiwen.com/subject/qdtlnhtx.html