Tôi đang cố gắng tìm ra cách để nạp năng động/nhập khẩu ẩn với PyInstaller, cho đến nay tôi có cấu trúc đơn giản này:Làm thế nào để thêm các mô-đun python động vào thông số kỹ thuật của PyInstaller?
Trước hết, tôi nhận được một gói khuôn khổ thêm vào cuộc sống của tôi trong PYTHONPATH d:\Sources\personal\python\framework
gói đó được sử dụng bởi nhiều dự án python của tôi, đặc biệt, nó được sử dụng với các dự án dưới đây đơn giản tôi muốn gói
Main project
├───data <- Pure static data
├───plugins <- Dynamic modules which uses framework's modules
├───resources <- Static data+embedded (generated by pyqt), used by plugins
│ ├───css
│ ├───images
| resources.py
| resources.qrc
main.py <- Uses framework's modules to load plugins dynamically
file spec của tôi trông như thế này:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['main.py'],
pathex=['d:\\sources\\personal\\python\\pyqt\\pyshaders'],
binaries=None,
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
##### include mydir in distribution #######
def extra_datas(mydir):
def rec_glob(p, files):
import os
import glob
for d in glob.glob(p):
if os.path.isfile(d):
files.append(d)
rec_glob("%s/*" % d, files)
files = []
rec_glob("%s/*" % mydir, files)
extra_datas = []
for f in files:
extra_datas.append((f, f, 'DATA'))
return extra_datas
###########################################
a.datas += extra_datas('data')
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='main',
debug=False,
strip=False,
upx=True,
console=True)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='main')
vấn đề này được đưa ra khi tôi cố gắng thêm nhập khẩu ẩn để phân tích (..., hiddenimports = [], ...) 's danh sách hiddenimports, tôi đã cố gắng cho đến nay này:
hiddenimports=['d:\\sources\\personal\\python\\pyqt\\plugins']
hiddenimports=['d:\\sources\\personal\\python\\pyqt\\plugins\\*']
hiddenimports=['plugins']
Cũng cố gắng liệt kê các file như cá nhân với đường dẫn tuyệt đối:
hiddenimports=[
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\api.py',
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\config.py',
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_actions.py',
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_dialogs.py',
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_docks.py',
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_post_init.py',
'd:\\sources\\personal\\python\\pyqt\\pyshaders\\plugins\\plugins_toolbar.py'
]
Và cũng đã cố gắng để tải chúng như các gói mô-đun (__init__.py
cuộc sống trong thư mục plugins)
hiddenimports=[
'plugins.api',
'plugins.config',
'plugins.plugins_actions',
'plugins.plugins_dialogs',
'plugins.plugins_docks',
'plugins.plugins_post_init',
'plugins.plugins_toolbar'
]
Cũng thử collect_submodules
hiddenimports=collect_submodules('plugins')
Không ai trong số những nỗ lực làm việc và thư mục Plugin isn' t được thêm vào đúng cách (khi tôi nói 'đúng' tôi đoán pyinstaller sẽ analize nhập khẩu được sử dụng bởi các plugin ẩn analiting đệ quy phụ thuộc của họ và sao chép các tập tin * .pyc) ... Vì vậy, tôi muốn biết làm thế nào tôi có thể quảng cáo không d đúng mô-đun "ẩn" đang được tải động theo thông số kỹ thuật của trình cài đặt.
Bạn có thể thử thêm các tệp vào phụ thuộc ['pure'] (https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation) bằng cách sử dụng [' TOC'] (https: //pythonhosted.org/PyInstaller/advanced-topics.html#toc-class-table-of-contents). – Repiklis
Có thể nhấn vấn đề này (https://github.com/pyinstaller/pyinstaller/issues/2009)? –
Bạn đã thử sử dụng các móc PyInstaller (https://pyinstaller.readthedocs.io/en/stable/hooks.html) chưa? Chúng được thiết kế chính xác cho mục đích đó. – void