python項目打包之Pyinstaller

眾多周知,python作為現在最流行的編程語言之一,以其語法簡單,便于上手和生態(tài)豐富等優(yōu)點,占據了各個編程榜的前幾名。而本公眾號的作者當時也受到這股風潮的撩動,加入了python編程的大軍。幸運的是,現所在的課題組也更多的使用python進行編程和分析數據,因此也算所學的東西沒有浪費吧。
然而,當最近希望發(fā)布之前用python寫的可視化項目Multi-omics Visual(推文為《高效繪圖小工具:Multi-omics Visual》)時,卻面臨打包發(fā)布較為復雜(相比于其他編程語言)的問題。事實上,提到python,大部分人腦海中更多的是開源和生態(tài)豐富,與打包分發(fā)的印象關聯不大。并且python官方也并未像c、c++、java等語言提供可以直接打包編譯分發(fā)的工具。于是,使用python編寫完項目后,如何將這個項目進行分發(fā)就成了難題。但是,python社區(qū)怎么會放任這個問題不管呢?隨后,python使用者們便有了pyinstaller模塊。這個模塊可以將python所寫的程序以及程序中所調用各種依賴模塊全部放在一起打包成一個exe文件或者一個包含可執(zhí)行exe程序的文件夾,方便軟件撰寫者分發(fā)軟件。只是,這一模塊在使用過程中會遇到諸多問題,需要通過各種途徑去解決。而本推文的作者在使用過程中已經遇到了各式各樣的坑,花了很多精力去解決。因此希望能夠記錄一下,避免自己或者后來人繼續(xù)踩坑。下面,推文將以打包流程與踩坑兩個部分為主,介紹相關內容,從而希望能夠幫助后來者少走彎路。
一?如何使用pyinstaller打包python項目
在CMD中調用命令,即可實現python程序的打包和發(fā)布。
細心的讀者會觀察到,本命令中并未包含任何用于打包的python腳本。這是因為打包所需要的腳本、資源、依賴等等內容都已經在setup.spec文件中指定。這個文件的內容如下:
spec文件的主要結構為:a =Analysis(content)。其中content即為打包過程中所需要的各種元素(資源)。其中content中包含了幾個非常重要的元素,將在下文一一展示。
content的第一元素(未指定名稱)為一個列表。這個列表包含的元素即為你所需要打包py文件與相關自定義模塊的絕對路徑
content的第二次元素pathex指定所打包的所有文件的絕對路徑
content的第三個元素datas以tuple的形式存儲用于打包的資源文件(一個或多個)。其tuple中每個元素包含兩個子元素。第一個子元素為該資源文件的絕對路徑,而第二次子元素即為資源文件在打包文件夾中的相對路徑
content的第四個元素hiddenimports為打包過程中所需要一并打包的隱藏模塊,通常是自己所調用的系統(tǒng)模塊和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腳本編譯成二進制文件再打包分發(fā),從而提高程序運行速度。cython模塊的安裝也較為簡單,直接通過“pip install pandas”一行命令即可完成。但是在windows系統(tǒng)下,使用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,之后再繼續(xù)安裝三個組件:MSVC v140 –VS 2015 C++生成工具(v14.00)、Windows通用CRT SDK和windows 10 SDK(10.0.16299.0)實現。
三?慣例小結
曾經在很早的時期,嘗試過使用pyinstaller打包相關python項目,但是當時遭遇到諸多問題無法解決,直接放棄了。后來,來的新的組,發(fā)現使用pyinstaller打包項目發(fā)布是可行,遂再一次嘗試,成功了。這也說明有些問題當時無法解決,可以放在哪里,等時機成熟了再去搗鼓,可能會有新的思路或方法。慣例繼續(xù)推廣一波
本公眾號開發(fā)的相關軟件,Multi-omics Hammer軟件和Multi-omics Visual軟件歡迎大家使用。文末是本公眾號在其他平臺的賬戶,也歡迎大家關注并多提意見。
簡書:WJ的生信小院
公眾號:生信小院
博客園:生信小院
最后,也歡迎各位大佬能夠在本平臺上:1傳播和講解自己發(fā)表的論文;2:發(fā)表對某一科研領域的看法;3:想要達成的合作或者相應的招聘信息;4:展示自己以尋找博后工作或者博士就讀的機會;5:博導提供博后工作或者博士攻讀機會,都可以后臺給筆者留言。希望本平臺在進行生信知識分享的同時,能夠成為生信分析者的交流平臺,能夠實現相應的利益互補和雙贏(不一定能實現,但是夢想總得是有的吧)。
另外,怎么說呢,投幣也可,不強求,但奢求


