专栏名称: 生信媛
生信媛,从1人分享,到8人同行。坚持分享生信入门方法与课程,持续记录生信相关的分析pipeline, python和R在生物信息学中的利用。内容涵盖服务器使用、基因组转录组分析以及群体遗传。
目录
相关文章推荐
51好读  ›  专栏  ›  生信媛

如何让Python脚本变成Windows应用

生信媛  · 公众号  · 生物  · 2020-05-10 12:00

正文

请到「今天看啥」查看全文


window下利用visual studio和cython编译pyqt5脚本为gui 程序

需求

有一个数据处理的脚本,需要对输入的excel文件进行少许处理后从长ID转成宽ID后再保存,用pandas很容易解决这个需求但是要打包成exe文在windows下使用。用pyinstaller,打出来的文件巨大无比而且报错。以前在linux系统下有过批量py文件为so文件的经验,那在windows下,可能也有类似的方法去解决问题。学习网上资料后,准备用cython把py文件编译成c文件,然后再用visual stuido里的cl编译成exe文件的方法。

目标

不用 pyinstaller 去制作又大又慢的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 的cl打包成exe文件

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 文件的目录,要放入到系统变量,或者如同我一样在编译时指定。
  • 建议装个 everything ,如果系统提示你缺少 xxxxx.h xxxx.lib ,去安装 vs2017 python 的目录,以及其他可能的相关目录下找。
    • 上面的命令就是提示少什么文件,然后我用 everything 去找再加入到命令行中去
  • 有些参数是参考了网上的教程
  • 生成的exe对象见为 /link /OUT:"C:\L2W\l2w.exe" , 260k左右大小

测试

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

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

如何解决?按照网上的做法,在系统里设置 PATHONHOME 变量,指向 C:\Anaconda3 目录,问题是解决了。

打包

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

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

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

精减

这个 C:\py3 里面还有多文件,能不能删除?经过我实践后发现根目录下,仅需要保留 python37.dll 文件, DLLs Lib 文件夹,就可正常运行。其实上述文件夹还可以进一步删除文件,但是每删除一个就要测试,搞不好删掉一个文件或文件夹,编译而成的exe文件无法运行。而且,关键是实现我代码功能的 pandas , nunpy , pyqt5 包本身就很大,所以删除一些周边的小文件对精减没有太大意义,因此就不用花太多时间和精力去测试运行依赖性。









请到「今天看啥」查看全文