使用 Py2Exe 编译的 Python 应用程序引发 UnknownTimezoneError 异常

     2023-02-23     74

关键词:

【中文标题】使用 Py2Exe 编译的 Python 应用程序引发 UnknownTimezoneError 异常【英文标题】:UnknownTimezoneError Exception Raised with Python Application Compiled with Py2Exe 【发布时间】:2012-02-27 20:28:42 【问题描述】:

我在分发使用 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 <module>
    tz_au = pytz.timezone("Australia/Sydney")
  File "pytz\__init__.pyc", line 185, in timezone
pytz.exceptions.UnknownTimeZoneError: 'Australia/Sydney'

我认为这是因为时区信息没有与可执行文件捆绑在一起,但我不确定如何实现。

编辑: 一个简单的解决方案是将 zoneinfo 目录从 python site-packages 目录中的 pytz 模块添加到 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()

【问题讨论】:

您还需要当前版本的 setuptools。特别是 pkg_resources。 'import pkg_resources' 不能失败。 pkg_resources 到底在哪里使用?还是直接导入? 【参考方案1】:

手动压缩 zoneinfo(如 Jason S 所述)确实有助于在我的一台计算机上构建包。 但是,当我在另一台计算机上构建软件包时 - 错误又回来了! 找到原因花了我一段时间 - 所以我最好分享一下。

建议的解决方案不适用于新的 pytz 版本(至少对于 2014.7)! 挖掘为什么会发现 pytz 将 zoneinfo 文件的格式从 pyc 更改为某种二进制格式。在我看来,通过这种更改,他们“打破”了将 pytz 打包成 zip 的选项,因为 python 的内置 zipimport 机制不适用于加载二进制文件。 其实这个问题应该由 pytz 解决 但是现在我找到了另一个解决方案:

只需将整个 pytz 目录直接复制到您的 dist 目录中 在您的程序中,将您的主可执行文件的路径添加到 python 的搜索路径中

实际上,这意味着在您的 setup.py 中将 pytz-zipping 替换为

import pytz, os, shutil
srcDir = os.path.dirname( pytz.__file__ )
dstDir = os.path.join( 'dist', 'pytz' )
shutil.copytree( srcDir, dstDir, ignore = shutil.ignore_patterns('*.py') )

并将 pytz 从“packages”选项移动到“excludes”:

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

在程序的主入口处(以确保在导入 pytz 之前执行它),您必须添加如下内容:

import os, sys
basePath = os.path.dirname( os.path.abspath( sys.argv[0] ) )
sys.path.insert( 0, basePath )

【讨论】:

这对我有用 (pytz 2014.10),但我必须从 shutil.copytree() 中删除所有忽略。 是的!有效!最奇怪的是,我的 pytz 和 py2exe 正在工作。然后我在我的程序中修改了一些东西,完全与pytz无关,突然停止工作并给出了UnkownTimeZoneError 言下之意,完全正确!那也是我的问题。而且由于(至少对我而言)py2exe 的作用以及它如何收集它的东西并不总是很明显,我什至不得不将调试打印破解到 pytz 以找出在 py2exe 的收集阶段出了什么问题。 :-) 为我工作。谢谢你:) 我还没有添加以下行: os.environ.setdefault('PYTZ_TZDATADIR', f'basePath\\pytz\\zoneinfo') 因为它仍然没有找到数据。 【参考方案2】:

一个简单的解决方案是将 zoneinfo 目录从 python site-packages 目录中的 pytz 模块添加到 library.zip em>。

为了自动执行此操作,我遵循了 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()

(由提问者回答)

【讨论】:

在 virtualenv 中使用 py2exe

】在virtualenv中使用py2exe【英文标题】:Usingpy2exeinavirtualenv【发布时间】:2013-11-2018:47:35【问题描述】:我有一个在Windows(Python2.7)上的virtualenv中开发的Python脚本。我现在想使用Py2exe将它编译成单个EXE。我已经阅读并阅读了文档和*... 查看详情

python编写游戏怎么打包——详解python+pygame游戏开发之使用py2exe打包游戏为exe文件(代码片段)

...件势在必行。在网上搜了几款关于python打包的程序,使用以后发现Py2exe是比较实用和方便的(py2exe是免费的)。1.简介Py2exe可以将一个Python程序打包成exe可执行文件,方便没有Python环境的电脑上使用程序。使用Py2ex... 查看详情

是否有与 python 3.5 兼容的 py2exe 版本?

...【发布时间】:2016-01-0223:06:39【问题描述】:我正在尝试使用以下命令使用最新的py2exe版本0.9.2.2编译我的python3.5文件:py-3.5-mpy2exe.build_exemyscript.py但它报告了这一点:“run-py3.5-w 查看详情

python编写游戏怎么打包——详解python+pygame游戏开发之使用py2exe打包游戏为exe文件(代码片段)

python编写游戏怎么打包1.简介2.软件准备3.打包流程最近在用python+pygame开发游戏,写完以后在分享给朋友玩的时候遇到了很大的问题,只有搭建了环境才能运行python脚本。这会吓退99%以上的人……所以把我们的游戏打包... 查看详情

python编写游戏怎么打包——详解python+pygame游戏开发之使用py2exe打包游戏为exe文件(代码片段)

python编写游戏怎么打包1.简介2.软件准备3.打包流程最近在用python+pygame开发游戏,写完以后在分享给朋友玩的时候遇到了很大的问题,只有搭建了环境才能运行python脚本。这会吓退99%以上的人……所以把我们的游戏打包... 查看详情

如何使用 py2exe 和 esky 冻结 Celery?

...:2014-04-0823:07:29【问题描述】:我正在尝试冻结一个Python应用程序和Celery,它与esky打包在一起以提供更新功能。我需要将Celery冻结,以便它可以看到第一个可执行文件中的模块,该可执行文件也将出现在py2exe创建的library.zip文件... 查看详情

如何对使用 py2exe 生成的二进制文件进行数字签名?

】如何对使用py2exe生成的二进制文件进行数字签名?【英文标题】:Howtodigitallysignabinaryproducedwithpy2exe?【发布时间】:2015-03-0211:35:34【问题描述】:我使用py2exe0.9.2.2将我的所有python脚本打包到Windows二进制文件中。我正在尝试将... 查看详情

在 Windows 98 中通过网络访问 py2exe 程序会引发 ImportErrors

】在Windows98中通过网络访问py2exe程序会引发ImportErrors【英文标题】:Accessingpy2exeprogramovernetworkinWindows98throwsImportErrors【发布时间】:2011-01-0120:46:00【问题描述】:我正在许多客户端机器上的一台服务器机器上运行一个py2exe编译的p... 查看详情

Py2Exe 应用程序被 Windows Defender 标记为恶意软件;该怎么办?

】Py2Exe应用程序被WindowsDefender标记为恶意软件;该怎么办?【英文标题】:Py2ExeapplicationflaggedasmalwarebyWindowsDefender;whattodo?【发布时间】:2014-07-1123:40:40【问题描述】:我有一个使用Python2.x、PyQT4和MySQLdb为我的公司编写的应用程序... 查看详情

适用于 XP 的 Python .exe

...2021-10-3122:56:54【问题描述】:我在尝试为WindowsXP构建.exe应用程序时遇到了一些问题。我已经为这个问题尝试了几种不同的“解决方案”。我使用的操作系统是windows11。首先,我使用anaconda创建了一个虚拟环境并安装了python3.4.3。... 查看详情

将已编译 Python 脚本的配置文件放在哪里?

...eretoputaconfigurationfileinPython?,但我询问的是在Windows系统上使用py2exe或类似工具编译/冻结的脚本。(即这个:Whatconfigfileformattousef 查看详情

pyqt5系列教程用py2exe进行程序打包

...的PyQt5项目后,一般都会将其打包成exe文件,方便其他人使用。今天我们就用Py2exe这个工具来打包上一堂课中完成的工程,工程源码在http://download.csdn.net/detail/djstavav/9351205。Py2exepy2exe是python的一个打包成exe的工具,官方提供的 查看详情

如果系统上没有安装python的话应该怎样运行python写的程序啊?

...该怎样运行python写的程序啊参考技术Awindows下的话,可以用py2exe把python程序编译成exe,在没安装python的机器运行.Linux默认都安装了python,怎么用py2exe可以搜下.别忘了追加分数给我啊.本回答被提问者采纳 查看详情

python3如何反编译exe(代码片段)

...支持通过py2exe和pyinstaller工具编译生成的EXE文件公司内部使用Python编写的代码,最终需要在发布前编译成windows执行的.EXE文件,所以今天在网上看到有相关牛人,github开源写了一个反编译代码程序,可以将WindowsEXE... 查看详情

Python - Py2exe 无法使用“电子邮件”模块构建 .exe

】Python-Py2exe无法使用“电子邮件”模块构建.exe【英文标题】:Python-Py2execan\'tbuild.exeusingthe\'email\'module【发布时间】:2010-09-1512:11:15【问题描述】:py2exe不适用于标准电子邮件模块你好。我正在尝试使用py2exe将脚本转换为exe。构... 查看详情

Py2Exe 检测为病毒。备择方案?

...7-0523:45:42【问题描述】:所以,我创建了一个python程序。使用Py2Exe转换为exe,并尝试使用PyInstaller和cx_freeze。所有这些都会触发程序在virustotal和我的本地计算机上被avast、avg和其他人检测为病毒。我尝试更改为HelloWorld脚本 查看详情

python自动运行.exe文件并保存结果

参考技术A1.下载并安装好py2exe,需要注意的是,py2exe所支持的python版本是不同的,下载时要注意对应的版本。2.编写一个配置脚本setup.py,具体代码为formdistutils.coreimportsetup\nimportpy2exe\nsetup(console[xxx.py]),console内的值是需要... 查看详情

如何使用 python Tkinter 隐藏 Windows 控制台?

...有什么区别。我尝试使用root.withdraw()但它所做的只是冻结应用程序,防止初始画布弹出,并且无论如何都无法删除命令提示符窗口。有人有解决办法吗 查看详情