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 файл, ако го създам. В моя случай говоря за library.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' говори за library.zip - cx_Freeze не архивира автоматично всичко за разпространение, въпреки че, разбира се, можете да направите това сами.   -  person Thomas K    schedule 19.05.2012
comment
хаха! Наистина е смешно за подчертаването. Споменато ли е някъде? Въпреки това тихо не прави нищо. Той създава папка в целевата библиотека.zip, но е празна. Ето какво предоставям наред с други неща в опцията build_exe "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