Я пытаюсь скомпилировать windows исполняемый файл из куска python кода. После долгих ударов головой о стену я обнаружил, что не удается загрузить конкретную библиотеку .dll, закопанную в scikit learn. Следуя другим вопросам на этом сайте, я обнаружил, что смог найти аргумент datas
в стандартном файле pyinstaller .spec
, чтобы найти его. Вроде.
Оказывается, единственный способ, с помощью которого pyinstaller делает рабочий исполняемый файл, - это если я вручную копирую .dll в папку, из которой запускаю скрипт, что дает мне /spec
файлы, которые выглядят так:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
added_files = [('C:\\Windows\\System32\vcomp140.dll', '.'),]
a = Analysis(['readevents.py'],
pathex=['[...]'],
binaries=[],
datas=[('vcomp140.dll','.')],
hiddenimports=['sklearn.utils._cython_blas','sklearn.neighbors.typedefs','sklearn.neighbors.quad_tree','sklearn.tree._utils'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='readevents',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True )
Это делает рабочий исполняемый файл, но, очевидно, не является устойчивым, потому что я не хочу отвечать на обновления вручную dll в моей папке сборки ...
Что я хочу чтобы сделать, это иметь аргумент datas
указать место, где фактический .dll находится внутри структуры установки Python, т.е. я установил:
datas=[('vcomp140.dll','C:/Program Files/Python38/Lib/site-packages/sklearn/.libs')],
но когда я это сделаю, он сборки хорошо, но когда я пытаюсь запустить его, я получаю следующую ошибку:
C:\Program Files\Python38\Lib\site-packages\sklearn\.libs\vcomp140.dll could not be extracted!
fopen: Invalid argument
Кто-нибудь есть какие-либо идеи, почему он работает, когда я вручную перемещаю .dll, но не удается, если я пытаюсь указать на его Собственное расположение в файловой системе?
это может иметь или не иметь значение, но импорт относится к модулю hdbscan
.
РЕДАКТИРОВАТЬ: Кажется, он не связан с пространством в Program Files
, так как я переместил его d к другим папкам без пробелов, где всегда будет происходить сбой, если только он не находится в том же каталоге, что и файл .spec
.