程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

[python]使用pyinstaller打包帶界面的Pytorch程序的多個問題

編輯:Python

1 opencv兼容性問題

1.1 現象

打包為一個exe完成後,在執行exe時,報錯:
ImportError: ERROR: recursion is detected during loading of “cv2” binary extensions. Check OpenCV installation.
如下圖所示:

1.2 原因及解決方式

pyinstaller和cv2版本存在兼容問題,卸載已有的opencv-python,安裝opencv-python=4.5.3.56

本人安裝的為python3.7,pyinstaller5.1,opencv版本高了.

可參見這裡:https://blog.csdn.net/weixin_50850903/article/details/125231985

2 缺乏yolov5下的兩個文件general.pyc和coco128.yaml

2.1 現象

打包為一個exe完成後,在執行exe時,報錯:缺少general.pyc和coco128.yaml。如下圖所示。

2.2 原因及解決方式

yolov5中應該是用到這兩個,但是沒包含。
(1)general.pyc為二進制文件,為general.py編譯後的格式,在VSCode中,運行工程文件,python中運行general.py時,自動生成了這個pyc文件,這個文件位於文件夾下面。


但這裡生成的是general.cpython-37.pyc,不是general.pyc,這也可能是找不到的原因。
將其進行重命名為general.pyc即可。
然後把他放在了utils下面。
(2)coco128.yaml為文本格式文件。工程中就有,在data\下面。直接用即可。

解決方法,在spec中包含這兩個文件即可。
spec定義如下:

a = Analysis(['D:XXX\\detect.py'],
pathex=[],
binaries=[(r'D:\XXX\XX\utils\general.pyc', r'.\utils' ) #進行拷貝,注意拷貝的目的文件夾需要與上面缺少的路徑一致。
],
datas=[(r'D:\XXX\data\coco128.yaml', r'.\data' )], #進行拷貝,注意拷貝的目的文件夾需要與上面缺少的路徑一致。
hiddenimports=[],
hookspath=[],
hooksconfig={
},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)

3 缺乏yolov5下的兩個文件general.pyc和coco128.yaml

3.1 現象

運行exe時,可以運行,但是有報警:
WARNING: file already exists but should not: C:\Users\workAI\AppData\Local\Temp_MEI132522\torch_C.cp37-win_amd64.pyd。
這個在命令行運行時,提示倒沒什麼。因為我做了一個界面程序,每次啟動時,有彈窗提示,如下圖所示,讓人很不爽。

3.2 原因及解決方法

不知道是不是pytorch本身的問題。這是說,在文本文件中多了一個文件,本來不應該有的,但是有了。
解決方法:在spec文件中,加一個搜索,從二進制引用的文件中,去掉這個。如下:

a = Analysis(['D:\XXX\detect.py'],
pathex=[],
binaries=[(r'D:XXX\utils\general.pyc', r'.\utils' )
],
datas=[(r'D:\XXX\data\coco128.yaml', r'.\data' )],
hiddenimports=[],
hookspath=[],
hooksconfig={
},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
for d in a.datas: #這樣遍歷一遍,刪除本不應該包含的即可。spec文件其實就是可以執行的python代碼
if '_C.cp37-win_amd64.pyd' in d[0]:
a.datas.remove(d)
break

補充說明:spec文件其實就是可以執行的python代碼!!!

4 帶界面的python程序如何去掉命令行界面

4.1 現象

點擊打包的exe時,先出現命令行界面,且一直有,然後再有界面。此時有個這很讓人感覺不爽。

4.2 解決方法

在spec文件中,配置如下,即可不彈出命令行界面了:

exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='XXX',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=".",
console=False, #此定義為False,則不彈出命令窗口了
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None )

5 帶界面的python程序啟動界面

5.1 現象

打包exe程序,這個pytorch的框架中,把其相關的包都打包進去了,有3.9個G大小,啟動exe,解壓縮到界面彈出來,時間非常長,又沒有了命令行提示,用戶都不知道情況。
為此,pyinstaller有閃屏功能,就是先加載一個提示窗口,可以顯示進度。
ps:這個界面也是用tinker庫實現的。
方法,在spec文件中增加splash對象,進行定義即可:

a = Analysis(['D:\CNG_Work\LostDistrictIdentify\\detect.py'],
pathex=[],
binaries=[(r'D:\CNG_Work\LostDistrictIdentify\utils\general.pyc', r'.\utils' )
],
datas=[(r'D:\CNG_Work\LostDistrictIdentify\data\coco128.yaml', r'.\data' )],
hiddenimports=[],
hookspath=[],
hooksconfig={
},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
for d in a.datas:
if '_C.cp37-win_amd64.pyd' in d[0]:
a.datas.remove(d)
break
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
splash = Splash(r'D:XXXX\Assets\CompanyLogo.gif', #只支持PNG格式。其他格式的話,如果裝了PIL則會自動轉換
#如果設置了最大尺寸max_img_size,且裝了PIL,則尺寸大時,則自動進行轉換縮放
binaries=a.binaries, #這裡的a就是前面定義的,這裡指向了他的二進制文件,
datas=a.datas
text_pos= (1240,405) #文本提示,提示上面的加載的二進制文件名稱 #None不顯示,或者顯示的位置(10, 50),
text_default = 'Initializing' #默認提示
text_size=12, #字體大小
text_color='black'
exe = EXE(pyz,
a.scripts,
splash, # <-- both, splash target,引用splash對象
splash.binaries, # <-- and splash binaries,顯示加載的文件內容
a.binaries,
a.zipfiles,
a.datas,
[],
name='XXX',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=".",
console=False,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None )

更多關於splash介紹,可參見pyinstaller官方介紹。https://pyinstaller.org/en/stable/usage.html?highlight=Splash#splash-screen-experimental
裡面有多個章節,可以搜索下,都看看。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved