社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何让Python脚本变成Windows应用

生信媛 • 5 年前 • 537 次点击  

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.hxxxx.lib,去安装vs2017python的目录,以及其他可能的相关目录下找。
    • 上面的命令就是提示少什么文件,然后我用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文件,DLLsLib文件夹,就可正常运行。其实上述文件夹还可以进一步删除文件,但是每删除一个就要测试,搞不好删掉一个文件或文件夹,编译而成的exe文件无法运行。而且,关键是实现我代码功能的pandas, nunpy, pyqt5包本身就很大,所以删除一些周边的小文件对精减没有太大意义,因此就不用花太多时间和精力去测试运行依赖性。



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/62827
 
537 次点击