問題
我正在嘗試使用PyInstaller創建一個應用程序供我公司內部使用。該腳本在工作的python環境下工作良好,但在翻譯爲包時丟失了某些內容。PyInstaller,如何包含由pip安裝的外部包中的數據文件?
我知道如何在我的包中包含和引用自己需要的數據文件,但是在導入時遇到包含或引用應該引入的文件時遇到問題。
我正在使用名爲tk-tools的可安裝pip軟件包,其中包含一些用於面板狀顯示器(看起來像LED)的漂亮圖像。問題是,當我創建一個pyinstaller腳本,這些圖像中的一個引用的任何時候,我得到一個錯誤:
DEBUG:aspen_comm.display:COM23 19200
INFO:aspen_comm.display:adding pump 1 to the pump list: [1]
DEBUG:aspen_comm.display:updating interrogation list: [1]
Exception in Tkinter callback
Traceback (most recent call last):
File "tkinter\__init__.py", line 1550, in __call__
File "aspen_comm\display.py", line 206, in add
File "aspen_comm\display.py", line 121, in add
File "aspen_comm\display.py", line 271, in __init__
File "aspen_comm\display.py", line 311, in __init__
File "lib\site-packages\tk_tools\visual.py", line 277, in __init__
File "lib\site-packages\tk_tools\visual.py", line 289, in to_grey
File "lib\site-packages\tk_tools\visual.py", line 284, in _load_new
File "tkinter\__init__.py", line 3394, in __init__
File "tkinter\__init__.py", line 3350, in __init__
_tkinter.TclError: couldn't open "C:\_code\tools\python\aspen_comm\dist\aspen_comm\tk_tools\img/led-grey.png": no such file or directory
我看着在最後一行在該目錄中 - 這是我的分佈位於 - 並發現目前沒有tk_tools
目錄。
問題
如何讓pyinstaller收集導入的包的數據文件?
SPEC文件
目前,我datas
是空白。規格文件,用pyinstaller -n aspen_comm aspen_comm/__main__.py
創建:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['aspen_comm\\__main__.py'],
pathex=['C:\\_code\\tools\\python\\aspen_comm'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='aspen_comm',
debug=False,
strip=False,
upx=True,
console=True)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='aspen_comm')
當我看着內/build/aspen_comm/out00-Analysis.toc
和/build/aspen_comm/out00-PYZ.toc
,我發現,看起來像是找到了tk_tools
包的條目。此外,還有tk_tools
包的功能在找到數據文件之前完美工作,所以我知道它正在導入某處,我只是不知道在哪裏。當我搜索tk_tools
時,在文件結構中找不到它。
我也嘗試了--hidden-imports
選項,結果相同。
部分解決
如果我「手動」在Analysis
使用datas = [('C:\\_virtualenv\\aspen\\Lib\\site-packages\\tk_tools\\img\\', 'tk_tools\\img\\')]
和datas=datas
,那麼所有作品添加路徑規範文件的預期。這將起作用,但我寧願PyInstaller查找包數據,因爲它明顯安裝。我會繼續尋找解決方案,但是 - 目前 - 我可能會使用這種非理想的解決方法。
如果你有包的控制權...
然後你就可以在分裝使用stringify,但這只是工作,如果它是你自己的包。
如果我理解正確,除了像這樣的解決方案之外你還需要什麼https://stackoverflow.com/a/31966932/4724196是'tk_tools'依賴靜態文件的自動發現方法,是否正確? – HassenPy
@HassenPy是的,但我懷疑自動發現已經是PyInstaller包的一部分,我只是沒有找到它的正確語法。鏈接的解決方案仍然具有將靜態文件硬編碼到'.spec'文件中的絕對路徑。我的印象是,安裝pip的軟件包應該毫不費力地插入PyInstaller,但顯然並非如此。感謝您的關注! – slightlynybbled