【问题标题】:How to call time from time.h with Cython?如何使用 Cython 从 time.h 调用时间?
【发布时间】:2014-10-21 09:36:42
【问题描述】:

我正在尝试直接使用 Cython 而不是 Python 的 import time 加载 time.h,但它不起作用。

我得到的只是一个错误

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

使用以下代码

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

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


    return ts

Cannot assign type 'long' to 'time_t *'

使用以下代码

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

有了数学日志,我可以简单地做

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

时间怎么不可能?

【问题讨论】:

  • time 的参数是要填充的time_t 值的地址(即:“指针”)或NULL
  • @SylvainLeroux 感谢您的回复。我选择使用 NULL 作为参数并且它可以工作。它可以被认为是安全的吗?
  • 我发布了我的回复作为答案。

标签: python time cython


【解决方案1】:

time 的参数是要填充的time_t 值的地址(即:“指针”)或NULL

引用man 2 time:

time_t time(time_t *t);

[...]

如果t不为NULL,则返回值也存储在t指向的内存中。

一些标准函数既返回一个值又(可能)将相同的值存储在提供的地址中是一种奇怪的做法。将0 作为参数传递是完全安全的,因为在大多数架构中NULL 等效于((void*)0)。在这种情况下,time 只会返回结果,不会尝试将其存储在提供的地址中。

【讨论】:

  • 据我了解,NULL 几乎总是应该使用,除非您存储结果。就我而言,我不需要存储它,所以没关系。顺便说一句很好的解释:)
【解决方案2】:

将 NULL 传递给时间。你也可以使用内置的 libc.time:

from libc.time cimport time,time_t

cdef time_t t = time(NULL)
print t

给了

1471622065

【讨论】:

  • 这是以秒还是纳秒为单位? cimport time 的文档在哪里?
猜你喜欢
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
相关资源
最近更新 更多