2017-10-27 4 views
0

私はタイムスタンプlong値の大きな列を変換しようとすると多くの時間を費やしているように、を避けるために、PythonからCのgmtime()関数にアクセスしようとしています。 。Pythonのctypes経由でgmtime()を使用

from ctypes import * 
libc = CDLL('msvcrt.dll') 
gmtime = libc.gmtime 
gmtime([any timestamp I try]) 

私は関係なく、私が中に入れたものを数17181872を取得していない私は、いくつかのnoobの間違いを犯してしなければならない

OSError: exception: access violation reading 0x0098967F

が、私はそれを把握することはできません。これは私が持っているものです。誰かが私のエラーを指摘できますか?

EDIT:

置き換えると、最後の行:

gmtime(byref(c_int64([any timestamp I try]))) 

で問題が解決しない - 私はすべてのアイデア私が置かれた任意の数の応答に17181872を取得しますか。? gmtime

+0

gmtimeに何を渡していますか? –

+0

エポックからロング値 – Jay

+1

gmtimeは値そのものではなく、その値へのポインタを必要とします。 –

答えて

2

定義:

struct tm *gmtime(const time_t *clock); 

ので、あなたがポインタを提供する必要があります。

tm = ctype.c_int64(1505656543) 
gmtime(ctypes.byref(tm)) 

gmtimeの戻り値の型は、構造体へのポインタです:

class TimeStruct(ctypes.Structure): 
    _fields_ = [ 
     ("tm_sec", ctypes.c_int), 
     ("tm_min", ctypes.c_int), 
     ("tm_hour", ctypes.c_int), 
     ("tm_mday", ctypes.c_int), 
     ("tm_mon", ctypes.c_int), 
     ("tm_year", ctypes.c_int), 
     ("tm_wday", ctypes.c_int), 
     ("tm_yday", ctypes.c_int), 
     ("tm_isdst", ctypes.c_int), 
    ] 
gmtime.restype = ctypes.POINTER(TimeStruct) 

time_data = gmtime(ctypes.byref(ctypes.c_int64(1505656543))) 
print(time_data.contents.tm_hour) 

しかし、これをすべて自分自身で行う必要はありません。 time.gmtimeは、C関数gmtimeを中心とした非常に薄いウェハーです。私はあなたがそれを使うよりも速くそれを得ることができるとは思わない。

+0

これは正しく聞こえますが、gmtime(byref(c_int64()))の中に入れた値に対して17181872が返ってきます。 – Jay

+0

@Jay: – Daniel

+0

Pythonのgmtime()はctypes経由よりも速くなっていましたが、その経験はかなり啓発されていましたが、私は現在ctypesでより快適に感じています。ありがとうございました。 – Jay

関連する問題