wxPython 对语言环境做了什么导致 pandas 崩溃?
What is wxPython doing to the locale to makes pandas crash?
当我尝试将 pandas 导入我的 wxPython 应用程序时,抛出了 "ValueError: unknown locale: en-US" 异常。我可以通过在应用程序启动之前导入 pandas 来避免这种情况,但这似乎是一个愚蠢的要求。
这在简单的 wx 应用程序中很容易重复:
import wx
class TestApp(wx.App):
def __init__(self, redirect=False, filename=None):
wx.App.__init__(self, redirect, filename)
import pandas
self.frame = wx.Frame(None, size=wx.Size(670,670), title='Test App')
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.frame.SetSizer(self.sizer)
if __name__ == '__main__':
app = TestApp()
app.MainLoop()
当我从我的虚拟环境中 运行 这个应用程序时,我得到这个堆栈跟踪:
(test) PS env_test> python .\test2.py Traceback (most recent call last):
File ".\test2.py", line 16, in <module>
app = TestApp()
File ".\test2.py", line 8, in __init__
import pandas
File "E:\Envs\test\lib\site-packages\pandas\__init__.py", line 32, in <module>
from pandas._libs import hashtable as _hashtable, lib as _lib, tslib as _tslib
File "E:\Envs\test\lib\site-packages\pandas\_libs\__init__.py", line 3, in <module>
from .tslibs import (
File "E:\Envs\test\lib\site-packages\pandas\_libs\tslibs\__init__.py", line 3, in <module>
from .conversion import localize_pydatetime, normalize_date
File "pandas\_libs\tslibs\c_timestamp.pxd", line 7, in init pandas._libs.tslibs.conversion
File "pandas\_libs\tslibs\c_timestamp.pyx", line 1, in init pandas._libs.tslibs.c_timestamp
File "pandas\_libs\tslibs\tzconversion.pyx", line 1, in init pandas._libs.tslibs.tzconversion
File "pandas\_libs\tslibs\timedeltas.pyx", line 1, in init pandas._libs.tslibs.timedeltas
File "pandas\_libs\tslibs\offsets.pyx", line 1, in init pandas._libs.tslibs.offsets
File "pandas\_libs\tslibs\ccalendar.pyx", line 13, in init pandas._libs.tslibs.ccalendar
File "pandas\_libs\tslibs\strptime.pyx", line 625, in init pandas._libs.tslibs.strptime
File "pandas\_libs\tslibs\strptime.pyx", line 530, in pandas._libs.tslibs.strptime.TimeRE.__init__
File "pandas\_libs\tslibs\strptime.pyx", line 405, in pandas._libs.tslibs.strptime.LocaleTime.__init__
File "pandas\_libs\tslibs\strptime.pyx", line 362, in pandas._libs.tslibs.strptime._getlang
File "c:\python37\lib\locale.py", line 587, in getlocale
return _parse_localename(localename)
File "c:\python37\lib\locale.py", line 495, in _parse_localename
raise ValueError('unknown locale: %s' % localename)
ValueError: unknown locale: en-US
我正在 运行使用 python3.7.4 在 Windows 10 上安装一个虚拟环境,安装了最少的软件包:
Package Version
--------------- -------
numpy 1.18.4
pandas 1.0.3
Pillow 7.1.2
pip 20.1
python-dateutil 2.8.1
pytz 2020.1
setuptools 46.1.3
six 1.14.0
wheel 0.34.2
wxPython 4.1.0
我可以在应用程序外部导入 pandas 就好了:
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
>>> df = pandas.DataFrame()
>>>
我很困惑,我一直无法在别处找到答案。其他 pandas "unknown locale" 错误似乎与未在 OSX 上导出语言环境有关。
看来将wxpython降级到4.0.7版本就可以解决问题了
它更像是与 wxpython 的语言环境有关,当 运行 locale.getlocale() 在 wx 应用程序中时我得到了同样的异常,当 运行 在 wx 应用程序之外时没有问题。
当降级到 4.0.7 时错误消失了,所以可以肯定的是 4.1.0 上有新的变化,限制检查语言环境甚至编码 UTF-8。
在初始化 wx.App 实例后,立即使用 setlocale 将语言环境设置回默认设置。在大多数环境中,这似乎解决了其余代码中由 wxpython 引起的区域设置问题,您可以继续使用 wxpython 4.1。
如果您仍然遇到问题,请参阅 this discussion 关于子类化 wx.App
app = wx.App(False)
locale.setlocale(locale.LC_ALL, '')
当我尝试将 pandas 导入我的 wxPython 应用程序时,抛出了 "ValueError: unknown locale: en-US" 异常。我可以通过在应用程序启动之前导入 pandas 来避免这种情况,但这似乎是一个愚蠢的要求。
这在简单的 wx 应用程序中很容易重复:
import wx
class TestApp(wx.App):
def __init__(self, redirect=False, filename=None):
wx.App.__init__(self, redirect, filename)
import pandas
self.frame = wx.Frame(None, size=wx.Size(670,670), title='Test App')
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.frame.SetSizer(self.sizer)
if __name__ == '__main__':
app = TestApp()
app.MainLoop()
当我从我的虚拟环境中 运行 这个应用程序时,我得到这个堆栈跟踪:
(test) PS env_test> python .\test2.py Traceback (most recent call last):
File ".\test2.py", line 16, in <module>
app = TestApp()
File ".\test2.py", line 8, in __init__
import pandas
File "E:\Envs\test\lib\site-packages\pandas\__init__.py", line 32, in <module>
from pandas._libs import hashtable as _hashtable, lib as _lib, tslib as _tslib
File "E:\Envs\test\lib\site-packages\pandas\_libs\__init__.py", line 3, in <module>
from .tslibs import (
File "E:\Envs\test\lib\site-packages\pandas\_libs\tslibs\__init__.py", line 3, in <module>
from .conversion import localize_pydatetime, normalize_date
File "pandas\_libs\tslibs\c_timestamp.pxd", line 7, in init pandas._libs.tslibs.conversion
File "pandas\_libs\tslibs\c_timestamp.pyx", line 1, in init pandas._libs.tslibs.c_timestamp
File "pandas\_libs\tslibs\tzconversion.pyx", line 1, in init pandas._libs.tslibs.tzconversion
File "pandas\_libs\tslibs\timedeltas.pyx", line 1, in init pandas._libs.tslibs.timedeltas
File "pandas\_libs\tslibs\offsets.pyx", line 1, in init pandas._libs.tslibs.offsets
File "pandas\_libs\tslibs\ccalendar.pyx", line 13, in init pandas._libs.tslibs.ccalendar
File "pandas\_libs\tslibs\strptime.pyx", line 625, in init pandas._libs.tslibs.strptime
File "pandas\_libs\tslibs\strptime.pyx", line 530, in pandas._libs.tslibs.strptime.TimeRE.__init__
File "pandas\_libs\tslibs\strptime.pyx", line 405, in pandas._libs.tslibs.strptime.LocaleTime.__init__
File "pandas\_libs\tslibs\strptime.pyx", line 362, in pandas._libs.tslibs.strptime._getlang
File "c:\python37\lib\locale.py", line 587, in getlocale
return _parse_localename(localename)
File "c:\python37\lib\locale.py", line 495, in _parse_localename
raise ValueError('unknown locale: %s' % localename)
ValueError: unknown locale: en-US
我正在 运行使用 python3.7.4 在 Windows 10 上安装一个虚拟环境,安装了最少的软件包:
Package Version
--------------- -------
numpy 1.18.4
pandas 1.0.3
Pillow 7.1.2
pip 20.1
python-dateutil 2.8.1
pytz 2020.1
setuptools 46.1.3
six 1.14.0
wheel 0.34.2
wxPython 4.1.0
我可以在应用程序外部导入 pandas 就好了:
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
>>> df = pandas.DataFrame()
>>>
我很困惑,我一直无法在别处找到答案。其他 pandas "unknown locale" 错误似乎与未在 OSX 上导出语言环境有关。
看来将wxpython降级到4.0.7版本就可以解决问题了
它更像是与 wxpython 的语言环境有关,当 运行 locale.getlocale() 在 wx 应用程序中时我得到了同样的异常,当 运行 在 wx 应用程序之外时没有问题。
当降级到 4.0.7 时错误消失了,所以可以肯定的是 4.1.0 上有新的变化,限制检查语言环境甚至编码 UTF-8。
在初始化 wx.App 实例后,立即使用 setlocale 将语言环境设置回默认设置。在大多数环境中,这似乎解决了其余代码中由 wxpython 引起的区域设置问题,您可以继续使用 wxpython 4.1。
如果您仍然遇到问题,请参阅 this discussion 关于子类化 wx.App
app = wx.App(False)
locale.setlocale(locale.LC_ALL, '')