Adam Barak Adam Barak - 3 months ago 19
Python Question

How to call time from time.h with Cython? I can't get it to work

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?

Answer

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.

Comments