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:
:
- Windows:
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.
- Обратите внимание, что (MacOS Monterey, 12.2 здесь) ожидаемая иерархия папок с вашим файлом .app будет похожа на эту,
pyinstaller не добавляет файлы и не создает необходимые папки ни в одной из папок этой структуры папок; по крайней мере, никоим образом. Вы их не найдете.
- Однако при запуске приложения в /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'
К счастью, этот ответ решает проблему.