Не удается создать автономный .exe с модулем pdftotext

Я пытаюсь преобразовать свой скрипт Python, содержащий модуль pdftotext, в автономный .exe. Когда я тестирую приложение .exe в своей среде anaconda, оно работает правильно, но когда я тестирую его на другом устройстве, оно дает мне эту ошибку:

File "main.py", line 3, in <module> #line 3 is import pdftotext
"ImportError: DLL load failed: The specified module could not be found"
[7300] Failed to execute script main

Я уверен, что проблема связана с модулем pdftotext, потому что я попробовал простой скрипт ниже и работает правильно:

a=input("Start")
print("Hello world")
b=input("End")

Ошибка появляется, если я конвертирую этот скрипт:

import pdftotext
a=input("Inserisci")
print("Hello world")
b=input("Fine")

Извините за мой плохой английский, я из Италии. надеюсь понятно выразился спасибо всем

РЕДАКТИРОВАТЬ 1. Я понял, что проблема может быть связана с poppler (библиотека, используемая pdftotext), но на данный момент я не могу понять, какой файл подключается для импорта poppler.

РЕДАКТИРОВАТЬ 2. После некоторой работы я обнаружил две вещи, которые могут помочь лучше понять мою ситуацию:

  1. Приложение .exe работает на моем устройстве (даже за пределами среды anaconda, где я установил poppler и pdftotext), но не работает на других устройствах (я пробовал два разных ноутбука с Windows, и ошибка та же); скрипт без 'pdftotext' работает на всех устройствах

  2. В папке dist (сборка с помощью pyinstaller) появляется один файл с именем pdftotext: это файл «pdftotext.cp37-win_amd64.pyd» (я не уверен, что это такое). В моей среде anaconda есть только два файла, которые содержат строку «pdftotext»: это файлы «pdftotext.cp37-win_amd64.pyd» и «pdftotext.exe».

РЕДАКТИРОВАТЬ 3 Полная ошибка при запуске main.exe на другом устройстве:

Traceback (most recent call last):
File "main.py",line 1, in <module>
ImportError: DLL load failed: The specified module could not be found
[7140] Failed to execute script main

Полный журнал pyinstaller:

(envPDF) C:\Users\miche\Desktop\project>pyinstaller --additional-hooks-dir=hooks main.py
65 INFO: PyInstaller: 3.6
65 INFO: Python: 3.7.6 (conda)
65 INFO: Platform: Windows-10-10.0.18362-SP0
65 INFO: wrote C:\Users\miche\Desktop\project\main.spec
65 INFO: UPX is not available.
81 INFO: Extending PYTHONPATH with paths
['C:\\Users\\miche\\Desktop\\project', 'C:\\Users\\miche\\Desktop\\project']
81 INFO: checking Analysis
81 INFO: Building Analysis because Analysis-00.toc is non existent
81 INFO: Initializing module dependency graph...
81 INFO: Caching module graph hooks...
81 INFO: Analyzing base_library.zip ...
3232 INFO: Caching module dependency graph...
3326 INFO: running Analysis Analysis-00.toc
3343 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
  required by c:\users\miche\anaconda3\envs\envpdf\python.exe
3608 INFO: Analyzing C:\Users\miche\Desktop\project\main.py
3624 INFO: Processing module hooks...
3624 INFO: Loading module hook "hook-encodings.py"...
3718 INFO: Loading module hook "hook-pydoc.py"...
3718 INFO: Loading module hook "hook-xml.py"...
3954 INFO: Loading module hook "hook-pdftotext.py"...
6537 INFO: Determining a mapping of distributions to packages...
29442 INFO: Packages required by pdftotext:
[]
33735 INFO: Looking for ctypes DLLs
33735 INFO: Analyzing run-time hooks ...
33746 INFO: Looking for dynamic libraries
34387 INFO: Looking for eggs
34387 INFO: Using Python library c:\users\miche\anaconda3\envs\envpdf\python37.dll
34390 INFO: Found binding redirects:
[]
34395 INFO: Warnings written to C:\Users\miche\Desktop\project\build\main\warn-main.txt
34430 INFO: Graph cross-reference written to C:\Users\miche\Desktop\project\build\main\xref-main.html
35274 INFO: checking PYZ
35274 INFO: Building PYZ because PYZ-00.toc is non existent
35274 INFO: Building PYZ (ZlibArchive) C:\Users\miche\Desktop\project\build\main\PYZ-00.pyz
35794 INFO: Building PYZ (ZlibArchive) C:\Users\miche\Desktop\project\build\main\PYZ-00.pyz completed successfully.
35802 INFO: checking PKG
35802 INFO: Building PKG because PKG-00.toc is non existent
35804 INFO: Building PKG (CArchive) PKG-00.pkg
35824 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
35824 INFO: Bootloader c:\users\miche\anaconda3\envs\envpdf\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe
35824 INFO: checking EXE
35824 INFO: Building EXE because EXE-00.toc is non existent
35824 INFO: Building EXE from EXE-00.toc
35824 INFO: Appending archive to EXE C:\Users\miche\Desktop\project\build\main\main.exe
35824 INFO: Building EXE from EXE-00.toc completed successfully.
35875 INFO: checking COLLECT
35875 INFO: Building COLLECT because COLLECT-00.toc is non existent
35875 INFO: Building COLLECT COLLECT-00.toc
96644 INFO: Building COLLECT COLLECT-00.toc completed successfully.

person Michele    schedule 31.03.2020    source источник


Ответы (1)


Что вам нужно, так это файл ловушки для PyInstaller. Чтобы процитировать документацию:

Таким образом, файл-ловушка расширяет PyInstaller, чтобы адаптировать его к особым потребностям и методам, используемым пакетом Python. ... ... Они помогают на этапе анализа найти нужные файлы.

Официальную документацию по хукам можно найти по адресу https://pyinstaller.readthedocs.io/en/stable/hooks.html.

Изменить: должно работать следующее:

Создайте эту структуру каталогов:

- yourcode.py
- hooks
  - hook-pdftotext.py

И в файле хука поместите следующее:

from PyInstaller.utils.hooks import collect_all

datas, binaries, hiddenimports = collect_all('pdftotext')

А затем построить с помощью:

$ pyinstaller --additional-hook-dir=hooks yourcode.py
person Legorooj    schedule 01.04.2020
comment
Я безуспешно пытался понять, какой крючок мне нужен. - person Michele; 01.04.2020
comment
@ Мишель, которую я редактировал. Если обновление работает, выберите правильный ответ, поставив галочку под кнопками голосования. - person Legorooj; 02.04.2020
comment
Спасибо, что помогли мне. Я попробовал ваш совет, но у меня все еще та же ошибка. Я редактирую свой вопрос, чтобы добавить некоторые новости - person Michele; 02.04.2020
comment
@ Мишель, можешь скопировать и вставить всю ошибку? Я хотел бы посмотреть, могу ли я заметить что-нибудь еще; collect_all редко выходит из строя. - person Legorooj; 02.04.2020
comment
Я публикую их выше. Папка dist теперь больше, потому что включает папку «site-packages», но ошибка все та же. Благодаря вашему совету в журнале pyinstaller теперь появляется: 29442 INFO: Пакеты, необходимые для pdftotext: []. но похоже результат пустой - person Michele; 02.04.2020
comment
Если это не слишком сложно, можете ли вы попытаться создать .exe с модулем pdftotext, чтобы проверить, моя ли это вина или нет? Спасибо - person Michele; 02.04.2020
comment
@Michele Я изучил это и понял проблему. pdftotext использует библиотеку poppler. Это библиотека C, которая не встроена в исполняемый файл, потому что PyInstaller не знает об этом. Это можно исправить, написав файл ловушки, который находит и копирует DLL. Однако, поскольку я не использую конду, это займет у меня несколько дней - времени у меня нет. Вся необходимая информация находится в Интернете; найдите библиотеки poppler и добавьте их в binaries файла ловушки. Я бы помог больше, но у меня нет времени. - person Legorooj; 03.04.2020
comment
Кроме того, poppler находится под лицензией GPL. На всякий случай, если вы не знали, это означает, что распространение вашего кода без публикации исходного кода является незаконным. - person Legorooj; 03.04.2020
comment
Хорошо, спасибо, без проблем. попробую по вашим советам - person Michele; 03.04.2020
comment
@Michele Где ты взял poppler двоичный файл? Я не вижу ни одного файла .dll, установленного в моей среде conda, в которой установлен poppler. - person user8491363; 21.02.2021
comment
В моем случае это файлы .dll: C:\Users\anaconda3\envs\envTEMP\Library\include. Однако я только что попробовал, и добавление файлов ловушек вручную больше не требуется для pdftotext. Просто попробуйте pyinstaller --onefile --hidden-import=pkg_resources.py2_warn test.py в среде conda, где вы установили как pdftotext (pip install pdftotext), так и poppler (conda install -c conda-forge poppler). Дайте мне знать, если это сработает для вас - person Michele; 23.02.2021