天天看點

pyinstaller下載下傳_使用pyinstaller打包的一些常見問題

pyinstaller下載下傳_使用pyinstaller打包的一些常見問題
寫在前面:

a:一般不建議将pytho程式打包,因為打包之後程式會比較大, 而且執行的效率會比較低。但事情不自己親自動手試一試是不會體會到其中的樂(xin)趣(suan)的。

b:如果你想打包的程式包含torchvision, 且版本>=0.3.0則正常的打包方法到最後是行不通的,程式是不可運作的。可行的變通是自己将torchvision 0.2.2.post3 變為 0.3.0的版本。這個過程有些技巧性。大概的思路是:0.2版本和0.3版本以及更高版本的核心差別是少了一個C++的擴充庫,是以隻要弄到這個庫【先安裝torchvision==0.3.0 然後後進去torchvision這個包,拷貝一下裡面的.pyd檔案,以及一些其他的函數,然後将torchvision==0.3.0解除安裝, 安裝torchvision==0.2.2.post3 然後将前面複制的pyd檔案和一些函數複制進去,對函數層面進行适當的修改就行了】,就可以将0.2版本僞裝成0.3以及以上的版本。

正文開始:

工具:>1

pyinstaller

關于pyinstaller 的介紹詳見官網 http://www.pyinstaller.org

>2 虛拟環境管理工具

pipenv

(強推):區分開發環境和運作環境還是很有必要的,而且會使程式的體量減少。

【NOTE】

安裝虛拟環境以前,首先要確定電腦中是否已經安裝了python 并确認python的版本。最好不要和Anaconda共用一個python,可能打包的時候會有些bug。

Pipenv 虛拟環境安裝:pip install pipenv

等待安裝成功

建構虛拟環境:pipenv可以為每一個project建構一個虛拟環境,當然也可以多個project共享一個虛拟環境。

這裡展示為一個單獨一個項目建構虛拟環境。(多個項目共享一個虛拟環境的情況隻要再包含這些項目的目錄下建構虛拟環境即可)

STEP1:

使用win+R組合鍵打開“運作”視窗,運作“cmd”進入控制台模式。

然後在

控制台

中進入到你所想打包項目的目錄下面【也可以先進入項目所在的檔案夾,然後先按住‘shift’鍵,

然後點選滑鼠右鍵,這個時候會出現“在此處打開指令行視窗”或者是“在此處打開powershell視窗”】

STEP2:

在視窗裡鍵入pipenv --python 3.x

注:3.x表示安裝的python版本,根據你已經安裝在電腦中python為主。

例如,你已經安裝了python3.7,

那麼pipenv --python 3.7 表示建構一個虛拟環境,以python3.7 作為編譯器。這個虛拟環境的位置一般在C:Users使用者名.virtualenvs 中

STEP3: 環境建構完成後,通過

pipenv shell

指令進入到這個虛拟環境。要想退出這個環境,輸入指令

exit

就可以退出這個環境了。為某個項目建構虛拟環境會在該項目所在目錄裡面生成一個

Pipfile

。這個Pipfile主要是記錄了這個虛拟環境裡所安裝的packages。如下圖所示:

pyinstaller下載下傳_使用pyinstaller打包的一些常見問題

可以在url裡面更換成國内的鏡像源,加快packages的下載下傳速度。我這裡用的是清華的鏡像源:

pypi清華鏡像源​pypi.tuna.tsinghua.edu.cn

後來就要為這個虛拟環境安裝一些你所需要的pakages

有兩種方法可以安裝你所需要的包。一種是通過

pipenv install name_of_packages

來安裝,另一種是事先準備好你這個項目所需的所有packages,寫在一個txt檔案中

,如

pyinstaller下載下傳_使用pyinstaller打包的一些常見問題

然後統一安裝:

pipenv install -r requirements.txt

NOTE:

pipenv安裝packages會生成一個

Pipfile.lock

的檔案,這個檔案主要是關于所下載下傳的packages的一些資訊。

pyinstaller下載下傳_使用pyinstaller打包的一些常見問題

這裡有每個包的hash值來校檢包的完整性。

需要注意的是,有點時候可能會因為hash值不比對而導緻安裝失敗,這個時候不要慌張,其實不是你的package有問題,可能是因為官方對于package做了改動但是沒來得及更新,解決辦法是先通過pip list看看你所需要的packages是否安裝成功(最好進入python環境中,import 一下)。如果檢查沒問題的話,那麼可以将Pipfile.lock删除。然後在控制台中通過pipenv lock來生成新的Pipfile.lock,其實如果一直生成不了,其實也不影響pakages的使用。

SETP3:

假設你們能成功到達第三步,那就恭喜你了,正式入坑了。打包的過程中會出現很多意想不到的bug。

最有意思的事莫過于debug了,不是嗎?(流着淚)

<a> 首先要驗證你的程式是否能正常運作

python your_program.py

測試一下所有功能是否正常後再進行打包。

<b> 如果檢查程式運作沒有問題,那麼就要開始打包了。打包所需的工具是

pyinstaller。

最簡單的打包操作是在控制台中輸入

pyinstaller

your_program.py

這種情況就會生成兩個目錄:build和dist目錄。build為臨時目錄,打包完成後可以删除,dist為打包完成後.exe檔案所在的目錄。

有兩種打包模式,第一種是打包成一個目錄的形式 D 即:軟體在一個目錄中,目錄中還包含其他的檔案。

第二種是打包成一個檔案的形式 F 即:隻打包成一個.exe檔案,裡面沒有其他的檔案。

第一種的指令為 pyinstaller -D your_program.py

也等價與

pyinstaller your_program.py 可見打包為檔案夾的形式是預設的行為。說明這種行為會很常見。

第二種指令為 pyinstaller -F your_program.py

這個僅以一個.exe檔案的形式表示出來,用的頻率會少一些。

至于什麼情況會用第一種,什麼情況會用第二種,我的總結是:如果你的程式很簡單,而且沒有你自己寫的一些pakages需要調用的話,那麼請放心使用任意一種。但是如果你的程式比較複雜,那麼最好是要用第一中打包模式。先将第二種情況。如果我目前的程式目錄是這樣的:

pyinstaller下載下傳_使用pyinstaller打包的一些常見問題

即這裡面的五個程式都是同級的,

main.py

作為主函數,分别點用了前面四個.py 檔案中的内容。那麼這個時候可以直接使用

pyinstaller -Fw main.py

進行打包【w參數是表征是不顯示控制台】這樣的話如果打包的過程中沒有出錯的話,就可以愉快的使用了,就算是程式報錯了,也會有彈窗提醒。

如果你的程式裡面有些其他的資源,如圖示、動畫、圖檔資料。假設是這樣存放的:

pyinstaller下載下傳_使用pyinstaller打包的一些常見問題

那麼打完包之後不要忘了将

datas

裡面的資料拷貝到

dist/main

目錄裡面去(因為

main.py

datas

在原始目錄中是平級的關系,是以在生成後的目錄中也要保持平級的關系)

下面着重将第一種。

如果你的目錄是這樣安排的:

pyinstaller下載下傳_使用pyinstaller打包的一些常見問題

這裡面的關系是

lib

目錄和

datas

目錄和

main.py

同級。而

main.py

則需要調用

lib

datas

裡面的函數和資源檔案。

那麼這種情況下,最好是用-D的模式打包,即

pyinstaller -Dw main.py

那麼打包成功之後,記得将

lib

目錄和

datas

目錄下的檔案都要拷貝到

dist/main

目錄下面。

STEP4[Optional]:

這一步不一定會需要,但是一般如果需要更進階别的操作和靈活性,那麼這一步是你的首選。我們無論是使用D模式還是F模式,都會在目前目錄下生成一個【假設主程式叫做

main.py

】。

pyinstaller下載下傳_使用pyinstaller打包的一些常見問題

這個檔案裡面分為幾個部分,第一個部分是

Analysis

,顧名思義是分析的部分,分析需要打包的檔案,需要導入的資料[

datas

]、動态庫[

binaries

]、隐藏的庫[

hiddenimports

]等等。第二部分是

PYZ

部分,不需要特别關注。第三部分是

EXE

部分,裡面有關于生成的可執行檔案的一些性質。如名稱[

name

]、是否開啟

debug

模式[debug, 調試階段建議把這個設定為True,

可以看到bug出在什麼地方],

是否使用

upx

壓縮[upx]等等。最後一個

COLLECT

部分就是将前面的三個部分收集起來。

靈活使用.spec檔案會避免出現很多bug喲。

我一般打包程式都是分兩步,第一步生成

main.spec

檔案,然後在

pyinstaller main.spec

[注意:此時pyinstaller後面接的是.spec檔案,而不是.py檔案]

具體來說:使用

pyi-makespec -D main.py

來生成main.spec 此時還未開始打包。

然後打開

main.spec

檔案,在

Analysis

部分田間程式所需的

datas,binaries, hiddenimports

。需要注意

datas

的格式為

[('original/path/to/data1', 'to'), ('original/path/to/data1', 'to')]

表示的意思是系統将自動把原本在

original/path/to

中的

data1

拷貝到

dist/main

中的

to

檔案夾中。

Binaries

也是一樣的格式(一般一開始不知道缺了什麼動态庫,即DLL檔案,一般先運作一次

pyinsatller main.spec

過程中有一個

“Looking for dynami libraries”

,如果缺了什麼庫,就在前面提到的虛拟環境裡查找這個

DLL

檔案,然後複制這個

DLL

檔案到項目所在的目錄下)

hiddenimports

值的是你原本已經安裝,但是再程式的運作中未找到的

pakages

STEP5[Optional]

這一步是關于壓縮程式的,有的時候即便是在虛拟環境中進行打包,最後程式還是很大。這個時候如果想進一步壓縮程式,則可以使用upx選項。

關于

upx

的介紹:

https://upx.github.io

upx是一款免費、小巧的對exe檔案進行壓縮的軟體。在官網上下載下傳自己pc所對應的版本,直接解壓就行了。(解壓後還不能直接使用,需要配合pyinstaller 一起使用)

正确的使用方法:

pyinstaller --upx-dir path/to/upx --clean main.py

--clean

參數是清楚一些殘留的,

--upx-dir

指的是剛剛你下載下傳解壓所存放upx的目錄。

Note:使用UPX經行壓縮時,可能程式是變小了一些,但是程式也不能用了。排查這種錯誤一般比較複雜,建議先以不壓縮的模式得到一個可以正常使用的程式,将這個程式保留,然後看使用upx壓縮後的程式的報錯,定位到某個dll檔案【一般是因為upx将某個啟動的dll檔案壓縮了,導緻程式無法正常啟動】,這個時候将無壓縮的程式中的dll檔案拷貝到使用upx壓縮的檔案夾中即可。

------------------------------------END 2019.9.22[modified 1]--------------------------