How to call time from time.h with Cython?

孤街醉人 提交于 2019-12-30 12:13:16

问题


I am trying to load time.h directly with Cython instead of Python's import time but it doesn't work.

All I get is an error

Call with wrong number of arguments (expected 1, got 0)

with the following code

cdef extern from "time.h" nogil:
    ctypedef int time_t
    time_t time(time_t*)

def test():
    cdef int ts
    ts = time()


    return ts

and

Cannot assign type 'long' to 'time_t *'

with the following code

cdef extern from "time.h" nogil:
    ctypedef int time_t
    time_t time(time_t*)

def test():
    cdef int ts
    ts = time(1)


    return ts

with math log I can simply do

cdef extern from "math.h":
    double log10(double x)

How comes it is not possible with time?


回答1:


The parameter to time is the address (i.e.: "pointer") of a time_t value to fill or NULL.

To quote man 2 time:

time_t time(time_t *t);

[...]

If t is non-NULL, the return value is also stored in the memory pointed to by t.

It is an oddity of some standard functions to both return a value and (possibly) store the same value in a provided address. It is perfectly safe to pass 0 as parameter as in most architecture NULL is equivalent to ((void*)0). In that case, time will only return the result, and will not attempt to store it in the provided address.




回答2:


Pass in NULL to time. Also you can use the builtin libc.time:

from libc.time cimport time,time_t

cdef time_t t = time(NULL)
print t

which gives

1471622065


来源:https://stackoverflow.com/questions/25533293/how-to-call-time-from-time-h-with-cython

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!