xceção @UnknownTimezoneError gerada com o aplicativo Python compilado com o Py2Exe
Estou tendo um problema ao distribuir um aplicativo que utiliza pytz. Estou a usar Py2Exe para criar um executável a partir da minha fonte Pytho
Para um exemplo simples do problema que estou tendo, tenho: pytz_test.py
import pytz
tz_au = pytz.timezone("Australia/Sydney")
print tz_au
e em setup.py
from distutils.core import setup
import py2exe
setup(console=['pytz_test.py'], options={"py2exe" : { 'packages': ['pytz'], } })
Executo setup.py
python setup.py py2exe
Que compila o executável. Executando o @ cria pytz_test.exe Eu recebo
Traceback (most recent call last):
File "pytz_test.py", line 3, in <module>
tz_au = pytz.timezone("Australia/Sydney")
File "pytz\__init__.pyc", line 185, in timezone
pytz.exceptions.UnknownTimeZoneError: 'Australia/Sydney'
Presumo que seja porque as informações do fuso horário não estão sendo agrupadas com o executável, mas não tenho certeza de como fazer isso acontece
EDIT: Uma solução simples seria adicionar o zoneinfo, no diretório pytz no diretório python site-packages, para o library.zip.
Para fazer isso automaticamente, segui a solução nesse projeto Feed de dados de trânsito do Google usado, de:http: //code.google.com/p/googletransitdatafeed/source/browse/trunk/python/setup.p
My modificado setup.py agora se parece com:
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()