2012-05-15 14 views
9

Zauważyłem, że pytz omija folder zoneinfo, gdy próbuję uruchomić zip dla Windows. Teraz mam obejście, które mogę używać po python setup.py build, mianowiciecx_freeze: Jak dodać pliki pakietów do library.zip?

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

Czy istnieje właściwa droga do osiągnięcia tego z setup.py czy coś?

+0

Możesz wypróbować opcję zip-includes. Dokumenty: http://cx_freeze.readthedocs.org/en/latest/distutils.html –

+0

Ta opcja służy do dodawania plików do ostatecznego pliku ZIP, jeśli go skompiluję. W moim przypadku mówię o bibliotece.zip, a nie ostatecznym ZIP do redystrybucji. Otrzymuję komunikat 'error: error in setup script: polecenie 'build_exe' nie ma takiej opcji 'zip-includes'' jeśli spróbuję tego, co sugerujesz. Zwykle używa się opcji _packages_, aby dołączyć tam kod, ale _pytz_ ma tylko pliki danych i opcja ta kończy się niepowodzeniem, jeśli spróbuję dodać "pakiet" _pytz/zoneinfo_. – mlt

+1

Spróbuj podać jako 'zip_includes', distutils mogą być zabawne o kreski/podkreślenia. Myślę, że 'zip-includes' mówi o bibliotece.zip - cx_Freeze nie zapisuje automatycznie wszystkiego, aby się rozpowszechniać, chociaż oczywiście możesz to zrobić samemu. –

Odpowiedz

12

Można rozwiązać ten problem, dodając następującą metodę:

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 

Następnie w pliku setup.py:

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

nadzieję, że pomoże

+1

To zadziałało dla mnie, dzięki! Musiałem wykonać jedną drobną modyfikację: skip_count potrzebne 1 dodane do niego inaczej miałaby wiodący ukośnik, który odrzuca pierwszy argument do os.path.join. – Motoma

+0

oznaczyć go jako rozwiązany? – chwi

+0

hm, python 3.4. Informacje o strefie są zawarte w 'pytz \ zoneinfo' ale nie zostały znalezione – Winand

2

mam rozwiązać ten problem Python 3.4 w następujący sposób:

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

Następnie dołączono pytz rozpakowane ze wszystkimi strefami czasowymi

Powiązane problemy