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, '')