cx_freeze: Как добавить файлы пакета в library.zip?

Я заметил, что pytz пропускает папку zoneinfo, когда я пытаюсь свернуть zip для Windows. Прямо сейчас у меня есть обходной путь, который я использую после python setup.py build, а именно

7z a -xr!*.py* build\exe.win32-2.7\library.zip C:\Python27\Lib\site-packages\pytz

Есть ли правильный способ добиться этого от setup.py или чего-то еще?


person mlt    schedule 15.05.2012    source источник
comment
Вы можете попробовать опцию zip-includes. Документы: cx_freeze.readthedocs.org/en/latest/distutils.html   -  person Thomas K    schedule 17.05.2012
comment
Эта опция предназначена для добавления файлов в окончательный ZIP, если я его соберу. В моем случае я говорю о библиотеке.zip, а не о окончательном ZIP для распространения. Я получаю error: error in setup script: command 'build_exe' has no such option 'zip-includes', если попробую то, что вы предлагаете. Обычно используется опция packages для включения туда кода, но pytz имеет только файлы данных, и эта опция не работает, если я пытаюсь добавить пакет pytz/zoneinfo.   -  person mlt    schedule 19.05.2012
comment
Попробуйте указать его как zip_includes, distutils может быть забавным в отношении тире/подчеркивания. Я думаю, что «zip-includes» говорит о библиотеке.zip — cx_Freeze не заархивирует все автоматически для распространения, хотя, конечно, вы можете сделать это самостоятельно.   -  person Thomas K    schedule 19.05.2012
comment
Хм! Действительно забавно про подчеркивание. Это упоминается где-нибудь? Однако он молча ничего не делает. Он создает папку в целевом архиве library.zip, но она пуста. Вот что я добавляю среди прочего в build_exe option "zip_includes": [("C:/Python27/Lib/site-packages/pytz/zoneinfo/", "pytz/zoneinfo/")] . pytz/zoneinfo/ пуст :( Также python setup.py bdist создает ZIP в папке dist.   -  person mlt    schedule 21.05.2012
comment
Я не думаю, что это упоминается где-либо в документах cx_Freeze. Если разберусь, добавлю примечание. Может быть, он не копирует автоматически целые папки? Возможно, вам придется использовать os.listdir() для создания списка нужных файлов.   -  person Thomas K    schedule 21.05.2012


Ответы (2)


Вы можете исправить это, добавив следующий метод:

def include_files():
        path_base = "C:\\Python27\\Lib\\site-packages\\pytz\\zoneinfo\\"
        skip_count = len(path_base) 
        zip_includes = [(path_base, "pytz/zoneinfo/")]
        for root, sub_folders, files in os.walk(path_base):
            for file_in_root in files:
                zip_includes.append(
                        ("{}".format(os.path.join(root, file_in_root)),
                         "{}".format(os.path.join("pytz/zoneinfo", root[skip_count:], file_in_root))
                        ) 
                )      
        return zip_includes

Затем в файл setup.py:

build_exe_options = {"packages": ["os"],
                     "excludes": ["tkinter"],
                     "zip_includes": include_files(),
                     ...
                     }

надеюсь, это поможет

person matuuar    schedule 03.12.2013
comment
Это отлично сработало для меня, спасибо! Мне пришлось внести одну небольшую поправку: к skip_count нужно было добавить 1, иначе он имел бы ведущую косую черту, которая уносила бы первый аргумент в os.path.join. - person Motoma; 13.03.2015
comment
хм, питон 3.4. Информация о зоне включена в pytz\zoneinfo, но не найдена - person Winand; 15.03.2016

Я решил эту проблему в Python 3.4 следующим образом.

import pytz
setup(
    ...
    options = {'build_exe':
        {'include_files': (pytz.__path__[0],), ...},
    }, 
)

Затем pytz включается в разархивированном виде со всеми его часовыми поясами.

person Winand    schedule 15.03.2016