1. 程式人生 > >python project 編譯Linux的可執行版本-pyinstaller

python project 編譯Linux的可執行版本-pyinstaller

python project 編譯Linux的可執行版本

                                        --2017.11.18

1.使用工具
pyinstaller

3.編譯方法
(1)編譯main.py
pyinstaller main.py (main.py是需要編譯的主程式檔案,後文中main同此)
注:編譯成功後會產生兩個資料夾:build和dist,可執行的版本就在dist中。
(2)執行程式
在/dist/main/下執行輸入 ./main 就可以執行

4.遇到的問題及解決方案
(1) 與‘ImportError: No module named _cwt’相關的問題
‘No module named xxx’問題一般是某個包沒有被打包編譯,解決辦法是修改main.spec檔案中的hiddenimports(main.spec檔案是pyinstaller main.py編譯後生成的),新增上該檔案的具體路徑。‘_cwt’這個問題出現的比較多,應該是與python有關,不是與專案中使用的包相關。google一下就能夠找到解決辦法,具體解決方案如下:
修改前:
hiddenimports=[],
修改後:
hiddenimports=[‘pywt._extensions._cwt’]
完成之後,再重新編譯,執行下面的命令
pyinstaller main.spec
後面遇到了類似的問題:‘ImportError: No module named _THCUNN’,這個問題是與該專案具體使用的包有關,因此網上沒有找到相關的答案。主要解決辦法是找到名為‘_THCUNN’的檔案,通過搜尋發現確實存在_THCUNN.so的檔案,確定該檔案路徑為torch/_thnn/_THCUNN.so。因此在hiddenimports中新增的東西為:torch._thnn._THCUNN。之後別忘了重新編譯:pyinstaller main.spec。
因此,遇到‘No module named xxx’問題時,修改hiddenimports是一個可以參考的解決思路。當然,並不確定是否所有類似的問題都能這樣解決,這裡只是提供一個解決思路。

(2) 與RuntimeError: Unable to find torch_shm_manager at /home/imaging/release_main/dist/-
main/torch/lib/torch_shm_manager相關問題
這個問題比較清楚,就是沒有找到某個檔案。解決這個問題的方法也很直接,就是將需要的檔案配置到指定的路徑。將torch包複製到/dist/main/路徑下,再次執行就可以了。
注:或許可以通過設定相關引數的方式將需要的torch包匯入,但是這方面的資訊比較少,沒有查詢到。
附:如果需要debug,方便解決問題,可以將main.spec中的debug屬性。
debug=False 改為 debug=True
後續遇到了類似的問題:
tensorflow/contrib/util/tensorflow/contrib/framework/python/ops/_checkpoint_ops.so: cannot open shared object file: No such file or directory
用同樣的方法即可解決。

(3)特殊問題:
Exception: Versioning for this project requires either an sdist tarball, or access to an upstream git repository. It’s also possible that there is a mismatch between the package name in setup.cfg and the argument given to pbr.version.VersionInfo. Project name mock was given, but was not able to be found.
[2103] Failed to execute script segm_main
該問題好像不具有一般性,沒有發現一些規律,只是找到了解決方案,如下:
檔案的首行插入
import os


#export pbr version for tensorflow user
os.environ["PBR_VERSION"]='3.0.1' #要去查詢自己的版本

(4)補充說明
1)上述所有的解決過程都是針對linux下的python projects,對於windows 下的python projects是否相同,並不確定,但可以參考解決思路。
2)pyinstaller編譯後,有些庫可能由於不同機器下版本不同,需要重新匯入。
3)實際上,pyinstaller的使用並不多,因此網上的資源比較少,遇到問題google上不容易找到解決方案,可以去pyinstaller的github,會有一些問題的解決方案,也可以發帖詢問,在這裡尋找答案更加具有針對性,具體網址:https://github.com/pyinstaller/pyinstaller/issues