python项目打包之Pyinstaller

众多周知,python作为现在最流行的编程语言之一,以其语法简单,便于上手和生态丰富等优点,占据了各个编程榜的前几名。而本公众号的作者当时也受到这股风潮的撩动,加入了python编程的大军。幸运的是,现所在的课题组也更多的使用python进行编程和分析数据,因此也算所学的东西没有浪费吧。
然而,当最近希望发布之前用python写的可视化项目Multi-omics Visual(推文为《高效绘图小工具:Multi-omics Visual》)时,却面临打包发布较为复杂(相比于其他编程语言)的问题。事实上,提到python,大部分人脑海中更多的是开源和生态丰富,与打包分发的印象关联不大。并且python官方也并未像c、c++、java等语言提供可以直接打包编译分发的工具。于是,使用python编写完项目后,如何将这个项目进行分发就成了难题。但是,python社区怎么会放任这个问题不管呢?随后,python使用者们便有了pyinstaller模块。这个模块可以将python所写的程序以及程序中所调用各种依赖模块全部放在一起打包成一个exe文件或者一个包含可执行exe程序的文件夹,方便软件撰写者分发软件。只是,这一模块在使用过程中会遇到诸多问题,需要通过各种途径去解决。而本推文的作者在使用过程中已经遇到了各式各样的坑,花了很多精力去解决。因此希望能够记录一下,避免自己或者后来人继续踩坑。下面,推文将以打包流程与踩坑两个部分为主,介绍相关内容,从而希望能够帮助后来者少走弯路。
一 如何使用pyinstaller打包python项目
在CMD中调用命令,即可实现python程序的打包和发布。
细心的读者会观察到,本命令中并未包含任何用于打包的python脚本。这是因为打包所需要的脚本、资源、依赖等等内容都已经在setup.spec文件中指定。这个文件的内容如下:
spec文件的主要结构为:a =Analysis(content)。其中content即为打包过程中所需要的各种元素(资源)。其中content中包含了几个非常重要的元素,将在下文一一展示。
content的第一元素(未指定名称)为一个列表。这个列表包含的元素即为你所需要打包py文件与相关自定义模块的绝对路径
content的第二次元素pathex指定所打包的所有文件的绝对路径
content的第三个元素datas以tuple的形式存储用于打包的资源文件(一个或多个)。其tuple中每个元素包含两个子元素。第一个子元素为该资源文件的绝对路径,而第二次子元素即为资源文件在打包文件夹中的相对路径
content的第四个元素hiddenimports为打包过程中所需要一并打包的隐藏模块,通常是自己所调用的系统模块和pip安装的模块
content的第五个元素exe中的name属性为打包后的exe文件的名称
content的第六个元素coll中的name属性为打包后的文件夹的名称
最后,通过指定上述元素,pyinstaller即可知道需要对那些资源进行打包,进而形成一个完成的文件夹。
二 遇到的问题
问题一:缺少必要的包
比如,我在运行过程中遇到现实wxpython未安装的情况,便可以使用pip install -U wxPython进行补充安装。除了直接指定名称的包之外,如果遇到“failed to execute pyi_rth_pkgres”错误,则需要通过“pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip”安装相应的包去解决。
问题二:打包程序所在文件夹。
如果你打包后运行exe程序,出现No module named '_socket'的错误。那么,你就需要检查一下你所运行的打包程序是不是buidl文件夹中的程序,而不是dist文件夹的程序。
问题三:运行速度慢
Python虽然语法简单,易于上手,但是常常因为运行速度不够快而遭人诟病。因此,为避免出现由python脚本编写软件导致的启动和运算速度慢的这两个问题,读者可以使用模块cython将python脚本编译成二进制文件再打包分发,从而提高程序运行速度。cython模块的安装也较为简单,直接通过“pip install pandas”一行命令即可完成。但是在windows系统下,使用cython编译.py后缀的文件时,常常会遭遇下面三个问题。
3.1 错误1:“UnicodeDecodeError: 'utf-8' codec can't decode byte **** in position”。
可以通过命令行输入chcp 65001即可解决。
3.2 错误2:程序时提示无法找到“rc.exe”。
解决方案便是把把C:\Program Files (x86)\Windows Kits\10\bin\10.0.17134.0\x86这个文件夹下面的 rc.exe和rcdll.dll复制到你所安装的Microsoft Visual Studio 14.0目录下即可,我的目录是在D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin这个文件夹下面即可。
3.3 错误3:程序运行时提示找不到“vcvarsall.bat”。
出现这一问题的原因是因为使用cython进行编译需要使用C++相应的程序才能实现。因此解决这一问题是需要先安装Visual Studio installer,之后再继续安装三个组件:MSVC v140 –VS 2015 C++生成工具(v14.00)、Windows通用CRT SDK和windows 10 SDK(10.0.16299.0)实现。
三 惯例小结
曾经在很早的时期,尝试过使用pyinstaller打包相关python项目,但是当时遭遇到诸多问题无法解决,直接放弃了。后来,来的新的组,发现使用pyinstaller打包项目发布是可行,遂再一次尝试,成功了。这也说明有些问题当时无法解决,可以放在哪里,等时机成熟了再去捣鼓,可能会有新的思路或方法。惯例继续推广一波
本公众号开发的相关软件,Multi-omics Hammer软件和Multi-omics Visual软件欢迎大家使用。文末是本公众号在其他平台的账户,也欢迎大家关注并多提意见。
简书:WJ的生信小院
公众号:生信小院
博客园:生信小院
最后,也欢迎各位大佬能够在本平台上:1传播和讲解自己发表的论文;2:发表对某一科研领域的看法;3:想要达成的合作或者相应的招聘信息;4:展示自己以寻找博后工作或者博士就读的机会;5:博导提供博后工作或者博士攻读机会,都可以后台给笔者留言。希望本平台在进行生信知识分享的同时,能够成为生信分析者的交流平台,能够实现相应的利益互补和双赢(不一定能实现,但是梦想总得是有的吧)。
另外,怎么说呢,投币也可,不强求,但奢求


