Yoyo-migrations: невозможно подключиться к SQLite, когда мое приложение упаковано с помощью pyinstaller ⇐ Python
Yoyo-migrations: невозможно подключиться к SQLite, когда мое приложение упаковано с помощью pyinstaller
У меня есть приложение Flask. Для простоты:
из yoyo.backends.core.sqlite3 import SQLiteBackend из yoyo.backends.core импортировать __all__ приложение = Flask(__name__, static_folder='static', template_folder='templates') защита __run_migrations(): db_path = '/op/mydb.db' бэкэнд = yoyo.get_backend(f"sqlite:///{db_path}") миграция_путь = путь_ресурса('./migrations/') log.info(f"корень проекта: {migrations_path}") миграции = yoyo.read_migrations(migrations_path) с backend.lock(): backend.apply_migrations(backend.to_apply(миграции)) если __name__ == '__main__' : __run_migrations() приложение.run() Все работает как надо. Но когда я запутываю свой код с помощью Pyarmor и упаковываю его с помощью pyinstaller, приложение не запускается. Ошибка:
Traceback (самый последний вызов — последний): Файл «yoyo\connections.py», строка 74, в get_backend. Файл «yoyo\backends\base.py», строка 570, в get_backend_class Файл «importlib_metadata\__init__.py», строка 294, в __getitem__ Ключевая ошибка: 'sqlite' Во время обработки вышеуказанного исключения произошло другое исключение: Traceback (последний вызов последний): Файл «», строка 3, в Файл «», строка 318, в Файл «», строка 302, в __run_migrations Файл «yoyo\connections.py», строка 76, в get_backend. yoyo.connections.BadConnectionURI: нераспознанная схема подключения к базе данных «sqlite». [18036] Не удалось выполнить сценарий «приложение» из-за необработанного исключения! Это моя спецификация приложения:
# --*- режим: python ; кодировка: utf-8 --*- # Добавьте папку pytransform в список данных данные = [ ("../dist/obf/pytransform", "pytransform"), ("../миграции/", "миграции"), ("../шаблоны", "шаблоны"), («../статический», «статический») ] блок_шифр = Нет а = Анализ( ['../app.py'], путьex=['.'], двоичные файлы = [], данные = данные, скрытыйимпортс = ['йойо'], путь крюка=[], крючкиconfig={}, runtime_hooks=[], исключает=[], win_no_prefer_redirects = Ложь, win_private_assemblies = Ложь, шифр = блочный_шифр, ноархив = Ложь, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) # для обнаружения запутанных зависимостей кода a.scripts[-1] = 'приложение', 'dist/obf/app.py', 'PYSOURCE' для меня в диапазоне (len(a.pure)): если a.pure[1].startswith(a.pathex[0]): x = a.pure[1].replace(a.pathex[0], os.path.abspath('dist/obf')) если os.path.exists(x): если hasattr(a.pure, '_code_cache'): с open(x) как f: a.pure._code_cache[a.pure[0]] = компиляция(f.read(), a.pure[1], 'exec') a.pure = a.pure[0], x, a.pure[2] exe = EXE( пыз, а.скрипты, двоичные файлы, .zip-файлы, данные, [], имя = 'приложение', отладка = Ложь, bootloader_ignore_signals = Ложь, полоса = Ложь, упх=Истина, upx_exclude=[], runtime_tmpdir = Нет, консоль=Истина, Disable_windowed_traceback = Ложь, argv_emulation = Ложь, target_arch = Нет, codesign_identity = Нет, entitlements_file = Нет, ) кол = СОБИРАТЬ( Exe, двоичные файлы, .zip-файлы, данные, полоса = Ложь, упх=Истина, upx_exclude=[], имя = 'приложение' ) А вот как я запутываю код и упаковываю его:
pip install -r require.txt pyarmor-7 запутывает ^ --рекурсивный ^ --output=расстояние\obf ^ --exclude="__pycache__" ^ --exclude="*.pyc" ^ --exclude="венв" ^ --exclude="config.yaml" ^ --exclude="requirements.txt" ^ --exclude="расстояние" ^ --exclude="журналы" ^ --exclude="статический" ^ --exclude="шаблоны" ^ app.py pyinstaller --clean -y infra\app.spec При отладке проблемы я вижу, что при запуске упакованного приложения точки входа yoyo.backend недоступны:
def get_backend_class(name): backend_eps = enter_points(group="yoyo.backends") вернуть backend_eps[имя].load() Это проблема из-за того, что в yoyo-migrations нет возможности pyinstaller загрузить все точки входа? Или что-то другое? Может кто-нибудь помочь, пожалуйста?
Спасибо
У меня есть приложение Flask. Для простоты:
из yoyo.backends.core.sqlite3 import SQLiteBackend из yoyo.backends.core импортировать __all__ приложение = Flask(__name__, static_folder='static', template_folder='templates') защита __run_migrations(): db_path = '/op/mydb.db' бэкэнд = yoyo.get_backend(f"sqlite:///{db_path}") миграция_путь = путь_ресурса('./migrations/') log.info(f"корень проекта: {migrations_path}") миграции = yoyo.read_migrations(migrations_path) с backend.lock(): backend.apply_migrations(backend.to_apply(миграции)) если __name__ == '__main__' : __run_migrations() приложение.run() Все работает как надо. Но когда я запутываю свой код с помощью Pyarmor и упаковываю его с помощью pyinstaller, приложение не запускается. Ошибка:
Traceback (самый последний вызов — последний): Файл «yoyo\connections.py», строка 74, в get_backend. Файл «yoyo\backends\base.py», строка 570, в get_backend_class Файл «importlib_metadata\__init__.py», строка 294, в __getitem__ Ключевая ошибка: 'sqlite' Во время обработки вышеуказанного исключения произошло другое исключение: Traceback (последний вызов последний): Файл «», строка 3, в Файл «», строка 318, в Файл «», строка 302, в __run_migrations Файл «yoyo\connections.py», строка 76, в get_backend. yoyo.connections.BadConnectionURI: нераспознанная схема подключения к базе данных «sqlite». [18036] Не удалось выполнить сценарий «приложение» из-за необработанного исключения! Это моя спецификация приложения:
# --*- режим: python ; кодировка: utf-8 --*- # Добавьте папку pytransform в список данных данные = [ ("../dist/obf/pytransform", "pytransform"), ("../миграции/", "миграции"), ("../шаблоны", "шаблоны"), («../статический», «статический») ] блок_шифр = Нет а = Анализ( ['../app.py'], путьex=['.'], двоичные файлы = [], данные = данные, скрытыйимпортс = ['йойо'], путь крюка=[], крючкиconfig={}, runtime_hooks=[], исключает=[], win_no_prefer_redirects = Ложь, win_private_assemblies = Ложь, шифр = блочный_шифр, ноархив = Ложь, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) # для обнаружения запутанных зависимостей кода a.scripts[-1] = 'приложение', 'dist/obf/app.py', 'PYSOURCE' для меня в диапазоне (len(a.pure)): если a.pure[1].startswith(a.pathex[0]): x = a.pure[1].replace(a.pathex[0], os.path.abspath('dist/obf')) если os.path.exists(x): если hasattr(a.pure, '_code_cache'): с open(x) как f: a.pure._code_cache[a.pure[0]] = компиляция(f.read(), a.pure[1], 'exec') a.pure = a.pure[0], x, a.pure[2] exe = EXE( пыз, а.скрипты, двоичные файлы, .zip-файлы, данные, [], имя = 'приложение', отладка = Ложь, bootloader_ignore_signals = Ложь, полоса = Ложь, упх=Истина, upx_exclude=[], runtime_tmpdir = Нет, консоль=Истина, Disable_windowed_traceback = Ложь, argv_emulation = Ложь, target_arch = Нет, codesign_identity = Нет, entitlements_file = Нет, ) кол = СОБИРАТЬ( Exe, двоичные файлы, .zip-файлы, данные, полоса = Ложь, упх=Истина, upx_exclude=[], имя = 'приложение' ) А вот как я запутываю код и упаковываю его:
pip install -r require.txt pyarmor-7 запутывает ^ --рекурсивный ^ --output=расстояние\obf ^ --exclude="__pycache__" ^ --exclude="*.pyc" ^ --exclude="венв" ^ --exclude="config.yaml" ^ --exclude="requirements.txt" ^ --exclude="расстояние" ^ --exclude="журналы" ^ --exclude="статический" ^ --exclude="шаблоны" ^ app.py pyinstaller --clean -y infra\app.spec При отладке проблемы я вижу, что при запуске упакованного приложения точки входа yoyo.backend недоступны:
def get_backend_class(name): backend_eps = enter_points(group="yoyo.backends") вернуть backend_eps[имя].load() Это проблема из-за того, что в yoyo-migrations нет возможности pyinstaller загрузить все точки входа? Или что-то другое? Может кто-нибудь помочь, пожалуйста?
Спасибо
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Невозможно использовать Microsoft.EntityFrameworkCore.Migrations.Design в проекте C#
Anonymous » » в форуме C# - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Невозможно использовать Microsoft.EntityFrameworkCore.Migrations.Design в проекте C#
Anonymous » » в форуме C# - 0 Ответы
- 26 Просмотры
-
Последнее сообщение Anonymous
-