wxpython使ってWindows向けGUIを作ってみていたのですが、
「application = wx.App()」とした後に
「datetime.datetime.strptime('20/Aug/2020:17:28:00', '%d/%b/%Y:%H:%M:%S').strftime('%Y/%m/%d %H:%M:%S')」としたら
「ValueError: unknown locale: ja-JP」となってしまいました。
デバッグで追っていったところwx.App()をするとイニシャル処理で「InitLocale()」が実行されて
「self._initial_locale = wx.Locale(wx.LANGUAGE_DEFAULT)」
と処理されて実行OSのlocaleが設定されるようなのですが・・・
https://docs.wxpython.org/wx.Language.enumeration.html
それが「ja_JP」となるようです。
「ja_JP.UTF8」とかじゃなくて「ja_JP」です。
localeに「ja_JP」が設定されている状態で
「locale.getlocale(locale.LC_TIME)」とかやると
(datetime.datetime.strptimeの中で実行されます。)
「ValueError: unknown locale: ja-JP」とエラーになります。
「ja_JP.UTF8」がセットされていれば
「ValueError: time data '20/Aug/2020:17:28:00' does not match format '%d/%b/%Y:%H:%M:%S'」というエラーになるのですが、そこまでたどり着くこともありません。
環境情報
OS: Windows 10
Python: 3.7.7
事象の再現と解消・・・というかとりあえず回避
import datetime
import wx
def test_func1(self):
print(datetime.datetime.strptime('20/Aug/2020:17:28:00', '%d/%b/%Y:%H:%M:%S').strftime('%Y/%m/%d %H:%M:%S'))
def test_func2(self):
application.ResetLocale()
print(datetime.datetime.strptime('20/Aug/2020:17:28:00', '%d/%b/%Y:%H:%M:%S').strftime('%Y/%m/%d %H:%M:%S'))
application.InitLocale()
if __name__ == '__main__':
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, title='test')
exechg_button1 = wx.Button(frame, wx.ID_ANY, 'エラー発生')
exechg_button2 = wx.Button(frame, wx.ID_ANY, 'エラー回避')
exechg_button1.Bind(wx.EVT_BUTTON, test_func1)
exechg_button2.Bind(wx.EVT_BUTTON, test_func2)
frame_sizer = wx.BoxSizer(wx.VERTICAL)
frame_sizer.Add(exechg_button1)
frame_sizer.Add(exechg_button2)
frame.SetSizer(frame_sizer)
frame.Show()
application.MainLoop()
「エラー発生」ボタンを押すと再現します。
「エラー回避」は解消というか回避案です。
ここではwx.APPで用意されている「InitLocale()」「ResetLocale()」を使用して回避しました。
https://wxpython.org/Phoenix/docs/html/wx.App.html
wx.APP()のイニシャル処理で設定されるロケールは「ResetLocale()」で元に戻せるようなので、「datetime.datetime.strptime」のようにlocaleの影響を意識しなければいけない処理に入る前に「ResetLocale()」して完了次第「InitLocale()」するようにしました。
「ResetLocale()」ではなく
「locale.setlocale(locale.LC_TIME, 'C')」と直接locale設定しても良かったのですが(というかそもそもlocaleを意識しなければいけない処理なので、それはそれで正しいかと思いますが)せっかくなのでwx.APPで用意してくれている「ResetLocale()」のみで対応しました。
私のWindows10環境でwxpython利用した際にlocaleを「ja_JP」ではなく「ja_JP.UTF8」にするにはどうすればいいのだろうか。
悩み中