Python社區(qū)文化崇尚開源肛响,復用质况,所以Python程序多以包的形式發(fā)布在PyPI這樣的包管理網(wǎng)站上威彰,而使用者默認已經(jīng)具備了Python的運行環(huán)境粪薛,這時只需要使用pip這類的工具,直接下載安裝即可使用寇钉。
作為一個公司或者個人開發(fā)者刀疙,我們不能指望我們的目標用戶環(huán)境已經(jīng)安裝了Python環(huán)境,更進一步扫倡,我們并不想我們寫的代碼被其他人看到谦秧。在這種情況下我們就有了兩個核心訴求。
- Python程序可以打包成像window中的exe這樣的獨立運行的程序撵溃。
- 程序可以加密或者編譯成二進制碼油够,而不是pyc這樣的字節(jié)碼,以防止被輕松反譯出原碼征懈。
打包成exe程序
目前打包成exe可執(zhí)行文件石咬,比較成熟的方案包括py2exe和cx_freeze。這兩種方案的操作基本大同小異卖哎,寫好setup.py鬼悠,然后執(zhí)行即可。官方文檔比較詳細亏娜,也可以在網(wǎng)絡上輕松找到其他參考資料焕窝,在此不再細說。這種情況下维贺,我們可以把程序運行信賴的Python環(huán)境和各個package都打包成一份它掂,這個時候,我們就可以將打包出來的包復制到其他的電腦直接運行了溯泣,與其他的程序并沒有什么區(qū)別虐秋。
當然,這樣打包出來的文件垃沦,除了依賴庫原生是dll的客给,會被加載進來,其他的python代碼肢簿,則會被編譯成pyc文件打包成lib添加到我們的目錄當中靶剑。我們都知道pyc文件是可以被簡單還原成源碼的,并不存在什么技術門檻池充,要想將代碼編譯生成dll或者exe桩引,我們還需要其他辦法。
編譯成二進制文件
Python的一般的執(zhí)行過程收夸,是python解釋器將pyc文件中的指令坑匠,即字節(jié)碼轉換成操作系統(tǒng)的機器碼,然后再進行執(zhí)行咱圆。我們想將源碼編譯成二進制碼笛辟,這就跳過了解釋器的將字節(jié)碼轉換成機器碼的過程功氨,這并沒有省略多少時間,但客觀上完成了源碼的加密手幢。那么捷凄,我們就來介紹一下Cython。
Cython是python的超集围来,也就是說跺涤,你寫的python代碼將完全可以被Cython接受,更重要的是监透,你還可以寫一些類型確定的代碼桶错,暫時拋下動態(tài)的語言屬性,在某些模塊出胀蛮,寫出比擬C語言速度的代碼院刁。當然,這不是我們當前關注的重點粪狼,我們只知道退腥,通過Cython我們可以將源碼編譯成pyd文件就可以了。
所以再榄,對于重點代碼狡刘,或者你想保護的代碼,將其通過cython編譯成pyd,然后以模塊的形式來加以調用就是可行的方案了困鸥。什么嗅蔬?你想保護所有代碼?疾就!不管你的代碼是不是那么值錢澜术,我們還有另外一個解決方案。
王炸登場虐译,Nuitka瘪板!這個軟件可以幫我們輕松實現(xiàn)吴趴,我們想將哪些源碼進行打包漆诽,甚至允許我們將所有的內容將整合到一個可執(zhí)行文件當中,用法也是極其簡單的锣枝,在這里也做說明厢拭,直接訪問官網(wǎng)即可。
爬坑
寫程序這件事撇叁,如果太順利供鸠,總感覺不真實,所以陨闹,有坑才是常態(tài)楞捂。我的項目使用PyQt5+twisted作為框架薄坏,在打包后,發(fā)現(xiàn)程序登錄后直接就卡死了寨闹,界面也沒有正確顯示胶坠,而且在日志中也沒有發(fā)現(xiàn)什么異常。再回頭查資料繁堡,從官網(wǎng)的說明中沈善,發(fā)現(xiàn)其對PyQt5的支持并不全面,而對PyQt6就信心滿滿了椭蹄。所以闻牡,我了一天時間將工程從PyQt5升級到了PyQt6, 一通的代碼修改绳矩,順便讓我了解了一下PyQt5與PyQt6的不同之處罩润。但問題并沒有消失,于是繼續(xù)定位翼馆,最終發(fā)現(xiàn)是QThread的原因哨啃!而另一篇帖子則無意中提到了PySide6,我順便就抱著試試看的心情將使用的包從PyQt6轉換成了PySide6,問題解決写妥!
- PySide6是Qt的母公司自己推出的產品拳球,屬于親兒子,而且在商業(yè)使用中不受限制珍特。
- PyQt6是第三方公司在市場推出的一個產品祝峻,如果要商用,應該是要收費的扎筒,或者商用的產品也必須進行開源莱找。
前后折騰了三天的時間,以上就是自己的所得嗜桌。之所以沒有將代碼或者命令行細節(jié)貼在這里奥溺,是因為不同的人的需求并不完全一致,而官方網(wǎng)站也有更詳細的說明骨宠,還是直接去官方參考最佳浮定。