2012-05-15 11 views
9

Ich habe festgestellt, dass pytz zoneninfo Ordner vermisst, wenn ich versuche, eine Zip für Windows zu rollen. Im Moment habe ich eine Abhilfe, die ich nach python setup.py build verwenden, nämlichcx_freeze: Wie füge ich Paketdateien in bibliothek.zip ein?

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

Gibt es einen richtigen Weg, das zu erreichen, von setup.py oder so etwas?

+0

Sie können die Zip-Includes-Option versuchen. Docs: http://cx_freeze.readthedocs.org/en/latest/distutils.html –

+0

Diese Option dient zum Hinzufügen von Dateien zum endgültigen ZIP, wenn ich es erstelle. In meinem Fall spreche ich von library.zip und nicht vom endgültigen ZIP für die Weiterverbreitung. Ich bekomme 'Fehler: Fehler im Setup-Skript: Befehl 'build_exe' hat keine solche Option 'zip-includes', wenn ich versuche, was Sie vorschlagen. Normalerweise benutzt man _packages_, um Code einzubinden, aber _pytz_ hat nur Datendateien und diese Option schlägt fehl, wenn ich versuche, ein "Paket" _pytz/zoneinfo_ hinzuzufügen. – mlt

+1

Versuchen Sie, es als 'zip_includes' zu geben, distutils kann lustig über Striche/Unterstriche sein. Ich denke, 'zip-includes' spricht von library.zip - cx_Freeze stellt nicht automatisch alles für die Verteilung bereit, obwohl Sie das natürlich selbst tun können. –

Antwort

12

Sie dieses Problem beheben könnte, das Hinzufügen der folgenden Methode:

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 

Dann in setup.py-Datei:

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

Hoffnung, die

+1

Das funktionierte gut für mich, danke! Ich musste eine kleine Änderung vornehmen: skip_count 1 wurde hinzugefügt, sonst hatte es einen führenden Schrägstrich, der das erste Argument an os.path.join wegbog – Motoma

+0

es als gelöst markieren? – chwi

+0

hm, python 3.4 Zone Informationen sind in 'pytz \ zoneinfo' enthalten, aber nicht gefunden – Winand

2

hilft ich dieses Problem gelöst haben in Python 3.4 in der folgenden Art und Weise

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

Dann ist pytz entpackt mit all seinen Zeitzonen

Verwandte Themen