Pyinstaller не принимает файлы дерева или данных

Я пытаюсь построить очень простой скрипт на python с помощью pyinstaller: print 'hello world!' и я пытаюсь сделать файл данных ИЛИ каталог файлов данных доступным для двоичного файла.

Я перечитывал документацию снова и снова, я пытался собрать с 1.5, 2.0 и dev build 2.0, я пытался собрать с --onefile AND --onedir, я пытался собрать на OS X и Linux, но по какой-то причине операторы datafile/tree в моем файле.spec, похоже, игнорируются.

Вот некоторые варианты.spec файла, которые я пробовал:

coll = COLLECT(exe,
               a.binaries
               [('README','/Users/username/my_little_app/foo','DATA')],
               Tree('/Users/username/my_little_app/foo','foo'),
               Tree('/foo','foo'),
               Tree('my_little_app/foo','foo'),
               [('my_xml_file.xml','my_little_app/partner.xml','DATA')],
               a.zipfiles,
               a.datas,
               strip=None,
               upx=True,
               name=os.path.join('dist', 'my_little_app'))


a.datas += [('my_xml_file.xml', '/Users/username/my_little_app/my_xml_file.xml',  'DATA')]

Я что-то упускаю?

1 ответ

Этот ответ довольно поздно, но способ добавления произвольных файлов в сборку PyInstaller довольно четко задокументирован:

https://pythonhosted.org/PyInstaller/

Первая строка в кортеже - это путь к файлу, вторая строка - это путь к встроенному пакету. Другими словами, ваша последняя строка должна выглядеть так:

a.datas += [("/path/to/my_xml_file.xml", "my_xml_file.xml")]

Вы также можете добавить полные каталоги, как это:

a.datas += [("/path/to/dir", "dir")]

Я добавил соответствующую часть документов ниже.


Добавление файлов в пакет

Чтобы добавить файлы в пакет, вы создаете список, описывающий файлы, и предоставляете его Analysis вызов.

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

Вы предоставляете список, который описывает файлы как значение datas= аргумент Analysis, Список файлов данных представляет собой список кортежей. Каждый кортеж имеет два значения, каждое из которых должно быть строкой:

  • Первая строка указывает файл или файлы, которые находятся сейчас в этой системе.
  • Второй указывает имена файлов в комплекте приложения во время выполнения.

Например, чтобы добавить один файл README в приложение с одной папкой, вы можете изменить файл спецификации следующим образом:

a = Analysis(...
     datas=[ ('src/README.txt', 'README') ],
     hiddenimports=...
     )

Вы сделали datas= аргумент одноэлементный список. Элемент представляет собой кортеж, в котором первая строка говорит, что существующий файл src/README.txt, Этот файл будет скопирован в комплект с именем README,

Файл спецификации будет более читабельным, если вы создадите список добавленных файлов в отдельной инструкции:

added_files = [
     ( 'src/README.txt', 'README' )
     ]
a = Analysis(...
     datas= added_files,
     ...
     )

Строки могут использовать либо / или же \ как символ разделителя пути. Вы можете указать входные файлы, используя сокращения "glob". Когда входные данные состоят из нескольких файлов, выходной строкой может быть имя папки. Например, чтобы включить все .mp3 файлы из определенной папки:

added_files = [
         ( '/mygame/sfx/*.mp3', 'sfx' ),
         ( 'src/README.txt', 'README' )
         ]

Все файлы совпадают /mygame/sfx/*.mp3 будет скопирован в пакет и сохранен в папке с именем sfx,

Путь к входному файлу или папке может быть абсолютным, как в первом кортеже, или относительным, как во втором. Когда это относительно, это берется как относительно местоположения файла спецификации.

Вы также можете включить все содержимое папки:

added_files = [
         ( '/mygame/data', 'data' ),
         ( '/mygame/sfx/*.mp3', 'sfx' ),
         ( 'src/README.txt', 'README' )
         ]

Все файлы в /mygame/data будет скопирован рекурсивно в папку с именем data в комплекте.

Простое объяснение

согласно последнему официальному документу: Добавление файлов данных, вашspec файл должен выглядеть так:

a = Analysis(xxx,
             pathex=xxx,
             binaries=[],
             datas=[
                ('README', '.'),
                ("/Users/username/my_little_app/my_xml_file.xml", "."),
                ('DATA', 'DATA'),

                ('/Users/username/my_little_app/foo', 'foo'),
                ("/path/to/dir", "dir"),
            ],

Детальное объяснение

обратитесь к моему ответу в другом сообщении: Pyinstaller добавляет файлы данных - qaru

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