Lan*_*nce 13 python py2exe pytz
我在分发使用pytz的应用程序时遇到问题.我正在使用Py2Exe从我的Python源创建一个可执行文件.
对于我遇到的问题的简单示例,我有:pytz_test.py:
import pytz
tz_au = pytz.timezone("Australia/Sydney")
print tz_au
Run Code Online (Sandbox Code Playgroud)
在setup.py中:
from distutils.core import setup
import py2exe
setup(console=['pytz_test.py'], options={"py2exe" : { 'packages': ['pytz'], } })
Run Code Online (Sandbox Code Playgroud)
然后我运行setup.py:
python setup.py py2exe
Run Code Online (Sandbox Code Playgroud)
编译可执行文件.运行创建的pytz_test.exe我得到:
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'
Run Code Online (Sandbox Code Playgroud)
我认为这是因为时区信息没有与可执行文件捆绑在一起,但我不确定如何实现它.
编辑:一个简单的解决方案是将zoneinfo目录从python site-packages目录中的pytz模块添加到library.zip.
为了自动执行此操作,我按照以下项目使用Google Transit数据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()
Run Code Online (Sandbox Code Playgroud)
一个简单的解决方案是将python site-packages 目录中的pytz模块中的zoneinfo目录添加到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()
Run Code Online (Sandbox Code Playgroud)
(提问者回答)
| 归档时间: |
|
| 查看次数: |
5345 次 |
| 最近记录: |