问题
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