6

問題

このコード

#!/usr/bin/env python
import pynotify
import time
import datetime

c='5/1/12 1:15 PM'
print c
dt = time.strptime(c, "%d/%m/%y %H:%M %p")

生産する

5/1/12 1:15 PM
Traceback (most recent call last):
  File "tmp.py", line 9, in <module>
    dt = time.strptime(c, "%d/%m/%y %H:%M %p")
  File "/usr/lib/python2.7/_strptime.py", line 454, in _strptime_time
    return _strptime(data_string, format)[0]
  File "/usr/lib/python2.7/_strptime.py", line 328, in _strptime
    data_string[found.end():])
ValueError: unconverted data remains: PM

import pynotify、_

#!/usr/bin/env python
import time
import datetime

c='5/1/12 1:15 PM'
print c
dt = time.strptime(c, "%d/%m/%y %H:%M %p")

エラーを削除します。

5/1/12 1:15 PM

どうして?!!?!

Python バージョン

Python 2.7.2+ (デフォルト、2011 年 10 月 4 日 20:06:09) [GCC 4.6.1] on linux2

通知します。ファイル

との印刷呼び出しを追加pynotify.__file__しましたdatetime.__file__

/usr/lib/python2.7/lib-dynload/datetime.so
/usr/lib/python2.7/dist-packages/gtk-2.0/pynotify/__init__.pyc
5/1/12 1:15 PM
Traceback (most recent call last):
  File "a.py", line 11, in <module>
    dt = time.strptime(c, "%d/%m/%y %H:%M %p")
  File "/usr/lib/python2.7/_strptime.py", line 454, in _strptime_time
    return _strptime(data_string, format)[0]
  File "/usr/lib/python2.7/_strptime.py", line 328, in _strptime
    data_string[found.end():])
ValueError: unconverted data remains: PM

PDB

5/1/12 1:15 PM
> /usr/lib/python2.7/_strptime.py(324)_strptime()
-> found = format_regex.match(data_string)
(Pdb) format
'%d/%m/%y %H:%M %p'
(Pdb) continue
> /usr/lib/python2.7/_strptime.py(329)_strptime()
-> if len(data_string) != found.end():
(Pdb) continue
> /usr/lib/python2.7/_strptime.py(331)_strptime()
-> raise ValueError("unconverted data remains: %s" %
(Pdb) len(data_string)
14
(Pdb) found.end()
12
(Pdb) found.group(0)
'5/1/12 1:15 '

'%d/%m/%y %H:%M %p'「5/1/12 1:15 PM」のすべてをキャプチャしていないように見えます

4

1 に答える 1

3

楽しい問題ですね。何が起こっているかは、pynotify がロケール設定を変更していることに賭けたいと思います。これはstrptime、タイムスタンプ文字列の解釈を壊しています。

理論を説明するいくつかのデバッグ print ステートメントを含むコードを次に示します。

#!/usr/bin/env python

import time
import datetime
import locale

print locale.getlocale()
import pynotify
print locale.getlocale()
c='5/1/12 1:15 PM'
print c
dt = time.strptime(c, "%d/%m/%y %H:%M %p")

私のシステムでは、次のようになります。

(None, None)
('en_US', 'UTF8')
5/1/12 1:15 PM

私はあなたのエラーを受け取っていませんが、pynotify がロケールを完全にばかげたものに設定し、strptime を混乱させている可能性があります。

たぶんそれを見て、ロケール設定を少しいじって、strptime を呼び出す前に設定を解除するか (pynotify がどのような仮定を行うかを知らずに後で元に戻す)、何かに設定されていることがわかった場合は、適切な設定に設定します。馬鹿な。

于 2012-05-02T07:08:22.613 に答える