Почему pyinstaller не может найти dll, если он не находится в той же папке, что и файл .spe c? - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь скомпилировать 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.

...