PyInstaller в macOS: IndexError «индекс кортежа вне диапазона» при включении папки .app в данныеPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 PyInstaller в macOS: IndexError «индекс кортежа вне диапазона» при включении папки .app в данные

Сообщение Anonymous »

У меня возникла проблема с PyInstaller при сборке приложения Python на macOS. Я постоянно получаю следующую ошибку:

Код: Выделить всё

IndexError: tuple index out of range
...
File ".../PyInstaller/utils/osx.py", line 672, in collect_files_from_framework_bundles
dir_name = remaining_path_parts[2]
IndexError: tuple index out of range

Контекст:

  • Операционная система: macOS на Mac mini M2 (Apple Silicon)
  • Опробованные версии Python: 3.8, 3.9 и 3.12
  • PyInstaller Опробованные версии: 6.10.0 и 6.11.0
  • Цель: превратить приложение Python в исполняемый файл macOS, включая определенные ресурсы, такие как >Браузер Chromium и драйвер chrome для macOS (Intel и ARM).

Структура папок:< /strong>


Вот соответствующая структура папок:

Код: Выделить всё

project_dir/
├── app_src/
│   ├── main.py
│   ├── assets/
│   ├── drivers/
│   │   ├── chromium/
│   │   │   └── macos/
│   │   │       ├── mac/            # Contains Chromium.app (Intel)
│   │   │       │   └── Chromium.app
│   │   │       └── mac_arm/        # Contains Chromium.app (ARM)
│   │   │           └── Chromium.app
│   │   └── chromedriver/
│   │       └── macos/
│   │           ├── mac/
│   │           │   └── chromedriver
│   │           └── mac_arm/
│   │               └── chromedriver
├── core_extensions/
│   ├── ...
├── final_output/
│   └── macos/
│       ├── build/
│       └── dist/
└── pyinstaller.spec

Содержимое файла pyinstaller.spec:[/b]

Код: Выделить всё

# -*- mode: python ;  coding: utf-8 -*-

import os
import shutil

block_cipher = None
project_dir = os.getcwd()

dist_dir = os.path.join(project_dir, 'final_output', 'macos', 'dist')

if os.path.exists(dist_dir):
shutil.rmtree(dist_dir)

datas = [
# Assets
(os.path.join(project_dir, 'app_src', 'assets'), 'assets'),

# Core Extensions
(os.path.join(project_dir, 'core_extensions'), 'core_extensions'),

# Chromium for macOS
(os.path.join(project_dir, 'app_src', 'drivers', 'chromium', 'macos', 'mac'), 'drivers/chromium/macos/mac'),
(os.path.join(project_dir, 'app_src', 'drivers', 'chromium', 'macos', 'mac_arm'), 'drivers/chromium/macos/mac_arm'),

# Chromedriver for macOS
(os.path.join(project_dir, 'app_src', 'drivers', 'chromedriver', 'macos', 'mac', 'chromedriver'), 'drivers/chromedriver/macos/mac'),
(os.path.join(project_dir, 'app_src', 'drivers', 'chromedriver', 'macos', 'mac_arm', 'chromedriver'), 'drivers/chromedriver/macos/mac_arm')
]

a = Analysis(
[os.path.join(project_dir, 'app_src', 'main.py')],
binaries=[],
datas=datas,
excludes=[],
hookspath=[],
runtime_hooks=[],
cipher=block_cipher,
hiddenimports=['_cffi_backend'],
pathex=[os.path.join(project_dir, 'app_src')]
)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
pyz,
a.scripts,
[],
upx=True,
debug=False,
strip=False,
name='example',
console=False,
exclude_binaries=True,
bundle_identifier='com.yourcompany.example'
)

coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
upx=True,
strip=False,
name='example'
)

Использованная команда:

Код: Выделить всё

pyinstaller ./final_output/macos/build/pyinstaller.spec --distpath ./final_output/macos --workpath ./final_output/macos/build

Полная ошибка:

Код: Выделить всё

...
9846 INFO: Looking for dynamic libraries
Traceback (most recent call last):
File "/Users/administrator/Desktop/example/desktop_app/app_src/.venv/bin/pyinstaller", line 8, in 
sys.exit(_console_script_run())
^^^^^^^^^^^^^^^^^^^^^
File "/Users/administrator/Desktop/example/desktop_app/app_src/.venv/lib/python3.12/site-packages/PyInstaller/__main__.py", line 231, in _console_script_run
run()
File "/Users/administrator/Desktop/example/desktop_app/app_src/.venv/lib/python3.12/site-packages/PyInstaller/__main__.py", line 215, in run
run_build(pyi_config, spec_file, **vars(args))
File "/Users/administrator/Desktop/example/desktop_app/app_src/.venv/lib/python3.12/site-packages/PyInstaller/__main__.py", line 70, in run_build
PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
File "/Users/administrator/Desktop/example/desktop_app/app_src/.venv/lib/python3.12/site-packages/PyInstaller/building/build_main.py", line 1227, in main
build(specfile, distpath, workpath, clean_build)
File "/Users/administrator/Desktop/example/desktop_app/app_src/.venv/lib/python3.12/site-packages/PyInstaller/building/build_main.py", line 1167, in build
exec(code, spec_namespace)
File "./final_output/macos/build/pyinstaller.spec", line 28, in 
a = Analysis(
File "/Users/administrator/Desktop/example/desktop_app/app_src/.venv/lib/python3.12/site-packages/PyInstaller/building/build_main.py", line 558, in __init__
self.__postinit__()
File "/Users/administrator/Desktop/example/desktop_app/app_src/.venv/lib/python3.12/site-packages/PyInstaller/building/datastruct.py", line 184, in __postinit__
self.assemble()
File "/Users/administrator/Desktop/example/desktop_app/app_src/.venv/lib/python3.12/site-packages/PyInstaller/building/build_main.py", line 971, in assemble
combined_toc += osxutils.collect_files_from_framework_bundles(combined_toc)
File "/Users/administrator/Desktop/example/desktop_app/app_src/.venv/lib/python3.12/site-packages/PyInstaller/utils/osx.py", line 672, in collect_files_from_framework_bundles
dir_name = remaining_path_parts[2]
IndexError:  tuple index out of range

Предпринятые на данный момент шаги:

  • Изменение версий Python : Я попробовал Python 3.8, 3.9 и 3.12, и все они привели к одной и той же ошибке.
  • Переключение версий PyInstaller : Пробовал использовать PyInstaller 6.10.0 и 6.11.0, обе безуспешно.
  • Переименование Chromium.app< /code>: Я переименовал Chromium.app в Chromium, чтобы PyInstaller не рассматривал его как пакет macOS, а затем обновил все ссылки в .spec и коде. Ошибка по-прежнему возникает.
  • Отключение UPX: Установите upx=False в .spec< /код> файл. Никакого эффекта.
  • Использование Tree из PyInstaller: Пробовал импортировать и использовать Tree чтобы добавить папку Chromium.app:

    Код: Выделить всё

    from PyInstaller.utils.hooks import Tree
    
    Это привело к ошибке:

    Код: Выделить всё

    ImportError: cannot import name 'Tree' from 'PyInstaller.utils.hooks'
    
  • Пользовательская функция для сбора файлов: Я использовал пользовательскую функцию для рекурсивного добавления файлов из Chromium.app
  • Пользовательская функция для сбора файлов: Я использовал пользовательскую функцию для рекурсивного добавления файлов из Chromium.app
  • Пользовательская функция для сбора файлов: Я использовал пользовательскую функцию для рекурсивного добавления файлов из Chromium.app
  • Пользовательская функция для сбора файлов: Я использовал пользовательскую функцию для рекурсивного добавления файлов из Chromium.app
  • Пользовательская функция для сбора файлов. код>:

    Код: Выделить всё

    def collect_app_files(source_dir, target_dir):
    files = []
    for root, dirs, filenames in os.walk(source_dir):
    for filename in filenames:
    file_source = os.path.join(root, filename)
    file_target = os.path.join(target_dir, os.path.relpath(root, source_dir))
    files.append((file_source, file_target))
    return files
    
    К сожалению, это также не решило проблему.
  • Журнал отладки:< /strong> Запустил PyInstaller с --log-level=DEBUG для получения дополнительной информации, но никаких дополнительных подсказок не появилось.

Дополнительная информация:

  • Аппаратное обеспечение: Mac mini M2 (Apple Silicon)
    Цель: включить браузер Chromium (версии для Intel и ARM) в окончательную сборку приложения для macOS.

Вопросы:

  • Как устранить ошибку IndexError: индекс кортежа вне диапазона при построении с PyInstaller на macOS?
  • Кто-нибудь сталкивался и решал подобную проблему?
Спасибо за помощь в вперед!

Подробнее здесь: https://stackoverflow.com/questions/791 ... luding-app
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»