UnknownTimezoneError Exception Raised with Python Application Compiled with Py2Exe

У меня проблема с распространением приложения, использующего pytz. Я использую Py2Exe для создания исполняемого файла из исходного кода Python.

Для простого примера проблемы, с которой я столкнулся, у меня есть: pytz_test.py:

import pytz

tz_au = pytz.timezone("Australia/Sydney")
print tz_au

и в setup.py:

from distutils.core import setup
import py2exe

setup(console=['pytz_test.py'], options={"py2exe" : { 'packages': ['pytz'], } })

Затем я запускаю setup.py:

python setup.py py2exe

Который компилирует исполняемый файл. Запустив созданный pytz_test.exe, я получаю:

Traceback (most recent call last):
  File "pytz_test.py", line 3, in 
    tz_au = pytz.timezone("Australia/Sydney")
  File "pytz\__init__.pyc", line 185, in timezone
pytz.exceptions.UnknownTimeZoneError: 'Australia/Sydney'

Я предполагаю, что это потому, что информация о часовом поясе не включается в исполняемый файл, но я не уверен, как это сделать.

EDIT: Простым решением будет добавить каталог zoneinfo из модуля pytz в каталоге python site-packages в library.zip.

Чтобы сделать это автоматически, я последовал решению в том проекте Google Transit Data Feed, который использовался, от: http://code.google.com/p/googletransitdatafeed/source/browse/trunk/python/setup.py

Мой модифицированный setup.py теперь выглядит так:

from distutils.core import setup
import glob
import py2exe

options = {
    "py2exe" : { 
        "compressed": 1, 
        "optimize": 2,
        'packages': ['pytz'], 
     } 
}

setup(console=['pytz_test.py'], options=options)

import pytz
import os 
import zipfile
zipfile_path = os.path.join("dist/" 'library.zip')
z = zipfile.ZipFile(zipfile_path, 'a')
zoneinfo_dir = os.path.join(os.path.dirname(pytz.__file__), 'zoneinfo')
disk_basedir = os.path.dirname(os.path.dirname(pytz.__file__))
for absdir, directories, filenames in os.walk(zoneinfo_dir):
    assert absdir.startswith(disk_basedir), (absdir, disk_basedir)
    zip_dir = absdir[len(disk_basedir):]
    for f in filenames:
      z.write(os.path.join(absdir, f), os.path.join(zip_dir, f))

z.close()

13
задан Efren 8 March 2016 в 01:10
поделиться