Pyinstaller добавление файлов данных

Я борюсь с pyinstaller, всякий раз, когда я собираю этот конкретный скрипт с графическим интерфейсом kivy и запускаю.exe после сборки, я получаю фатальную ошибку, что он не может выполнить скрипт. Я запустил его через cmd, и он выдает ошибку: IOError: [Errno 2] No such file or directory: 'main.kv'

Я попытался добавить файл.kv, а также файлы mdb и dsn (используя pypyodbc в скрипте), используя --add-data при запуске сборки, но при этом я получаю ошибку: unrecognized arguments: --add-data'main.kv'(Остальные указанные файлы для --add-data приведены ниже) Есть ли какие-либо решения для этого или, возможно, альтернативные методы?

5 ответов

Как говорили другие (@Anson Chan, @schlimmchen):

Если вы хотите добавить дополнительные файлы, вам следует использовать Добавление файлов данных.

Два способа реализовать

  • Командная строка: добавить параметр в--add-data
  • Файл спецификации: добавить параметр вdatas=
    • Генерируется при запуске pyinstaller первый раз.
      • Позже вы сможете отредактировать свой *.spec файл.
      • Затем бег pyinstaller будет напрямую использовать ваш *.spec файл.

Parameter Логика

Параметр в --add-data или datas=:

  • --add-data:
    • формат: {source}{os_separator}{destination}
      • os_separator:
        • Windows: ;
        • Mac / Linux / Unix: :
      • source а также destination
        • Логика:
          • source: путь к одному или нескольким файлам, поддерживающий синтаксис glob. Сообщает PyInstaller, где найти файл (ы).
          • destination файл или файлы: папка назначения, которая будет содержать ваши исходные файлы во время выполнения. * ПРИМЕЧАНИЕ: НЕ имя файла назначения.
            • папка: путь к папке назначения, ОТНОСИТЕЛЬНЫЙ к корню назначения, а НЕ абсолютный путь.
    • Примеры:
      • Отдельный файл: 'src/README.txt:.'
      • несколько файлов: '/mygame/sfx/*.mp3:sfx'
      • папка: /mygame/data:data'
  • datas=
    • Формат: список или кортеж.
    • Примеры: см. Следующее.
added_files = [
    ( 'src/README.txt', '.' ),
    ( '/mygame/data', 'data' ),
    ( '/mygame/sfx/*.mp3', 'sfx' )
]

a = Analysis(...
    datas = added_files,
    ...
)

Ваш случай

Для вашей (ОС Windows) это:

  • --add-data в командной строке
    • pyinstaller -F --add-data "main.kv;." yourtarget.py

ИЛИ:

  • datas= в yourtarget.spec файл, см. следующее:
a = Analysis(...
    datas = ["main.kv", "."],
    ...
)

Если вы проверите pyinstaller -h за помощью вы можете найти --add-data опция работает так [--add-data <SRC;DEST or SRC:DEST>], Так что в вашем случае попробуйте

pyinstaller -F --add-data "main.kv;main.kv" yourtarget.py

Решение состоит в том, чтобы запустить: pyi-makespec yourscript.pyЗатем отредактируйте скрипт yourscript.spec и добавьте файлы в разделе данных в = Анализ.

datas=[ ( '/pathToYourFile/main.kv', '.' )]

затем беги pyinstaller yourscript.specдолжно быть хорошо после этого.

Следующая опция -F или --onefile предполагается при запуске pyinstaller.

  1. Обратите внимание, что (MacOS Monterey, 12.2 здесь) ожидаемая иерархия папок с вашим файлом .app будет похожа на эту,

pyinstaller не добавляет файлы и не создает необходимые папки ни в одной из папок этой структуры папок; по крайней мере, никоим образом. Вы их не найдете.

  1. Однако при запуске приложения в /var/folders используется временная папка, которая сильно отличается от структуры папок в пункте 1 выше. print(os.path.dirname(__file__))во время работы приложение покажет, какая именно временная папка используется при каждом запуске. Для удобства назовем его my_app_tmp_folderт.е. ваше приложение работает в папке

Затем pyinstaller добавляет файлы данных или создает необходимые каталоги в этой временной папке. Другими словами, при запуске приложения все добавленные файлы будут находиться там и в соответствии с заданной структурой папок (сквозной вариант). print(os.listdir(os.path.dirname(__file__)))покажет системе и приложению необходимые файлы и папки.

Итог: файлы, указанные с --add-dataвариант будет виден с /var/folder/my_app_tmp_folderпри запуске, а не в папке *.app.

Несколько полезных ссылок из документации:

https://pyinstaller.readthedocs.io/en/stable/runtime-information.html#using-файл

https://pyinstaller.readthedocs.io/en/stable/spec-files.html#добавление-файлов-в-комплект

https://pyinstaller.readthedocs.io/en/stable/operating-mode.html#bundling-to-one-file

В моем приложении была эта проблема и последующая проблема, которая вероятна, если не неизбежна.

1. --add-data для файла kv

Использовать --add-data как в ответе crifan.

2. Киви все еще не может найти файл

Как только PyInstaller помещает файл kv в правильный каталог, Kivy по-прежнему не может найти файл.

Возможные симптомы:

  • Графический интерфейс запускается, но экран черный и пустой.
  • Ошибка AttributeError, зависящая от кода приложения.

Примеры AttributeError:

  • Этот вопрос

  • Мой собственный случай:

    AttributeError: 'NoneType' object has no attribute 'ids'

К счастью, этот ответ решает проблему.

Другие вопросы по тегам