ivknv/yadisk

[Bug] requests is not installed. После компиляции кода

Seraphim19119 opened this issue · 4 comments

Код работает, но после компиляции начинает выдавать ошибку:
Traceback (most recent call last):
File "yadisk\client.py", line 227, in init
File "yadisk\import_session.py", line 47, in import_session
ModuleNotFoundError: No module named 'yadisk.sessions'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "main.py", line 3, in
File "yadisk\client.py", line 229, in init
RuntimeError: requests is not installed. Either install requests or provide a custom session

код:

import yadisk

client = yadisk.Client(token="*****")
# или
# client = yadisk.Client("<id-приложения>", "<secret-приложения>", "<токен>")

# Вы можете использовать либо конструкцию with, либо вручную вызвать client.close() в конце
with client:
    # Проверяет, валиден ли токен
    print(client.check_token())

    # Скачивает "/some-file-to-download.txt" в "downloaded.txt"
    client.download("**", "**")
  • ОС: Windows
  • Версия библиотеки yadisk: 2.1.0
  • Версия Python: 3.12.1
  • Компилировал через auto-py-to-exe: "pyinstaller --noconfirm --onefile --windowed "main.py""

Знакомая проблема, кто-то уже сообщал мне о подобном (но не гитхабе).

yadisk динамически подгружает модуль yadisk.sessions.requests_session (по умолчанию используется requests), PyInstaller этого не видит и не включает в сборку.

Тут есть 2 варианта решения:

  1. добавить опцию --hidden-import=yadisk.sessions.requests_session при сборке exe'шника
  2. явно импортировать класс RequestsSession и передать в конструкторе yadisk.Client session=RequestsSession()

Сообщение об ошибке всё равно, конечно, вводит в заблуждение, поменяю его в следующей версии.

Спасибо огромное, это и вправду помогло<3

Доброго времени суток.
А можно по подробнее на счет того что именно надо делать в втором варианте, а то совсем не понятно :_

ivknv commented

А можно по подробнее на счет того что именно надо делать в втором варианте, а то совсем не понятно :_

Можно сделать так:

import yadisk
from yadisk.sessions.requests_session import RequestsSession

with yadisk.Client(token=..., session=RequestsSession()) as client:
    print(client.check_token())
    ...

В таком случае PyInstaller должен сам обнаружить все импорты без дополнительных опций.