【问题标题】:Python time.time() -> IOErrorPython time.time() -> IOError
【发布时间】:2011-09-02 00:16:23
【问题描述】:

我刚刚安装了一个基本的 gentoo stage 3,当我尝试调用 time.time() 时出现以下错误:

sbx / # 蟒蛇 进口时间 Python 2.7.1(r271:86832,2011 年 5 月 22 日,14:53:09) [GCC 4.4.5] 在 linux2 上 输入“帮助”、“版权”、“信用”或“许可”以获取更多信息。 >>> 进口时间 >>> 时间.时间() 回溯(最近一次通话最后): 文件“”,第 1 行,在 IOError:[Errno 0] 错误

我发现这是因为当我尝试运行 Emerge 时,我得到:

sbx / # 出现 回溯(最近一次通话最后): 文件“/usr/bin/emerge”,第 32 行,在 从 _emerge.main 导入emerge_main 文件“/usr/lib/portage/pym/_emerge/main.py”,第 6 行,在 导入日志 文件“/usr/lib/python2.7/logging/__init__.py”,第 94 行,在 _startTime = time.time() IOError:[Errno 11] 资源暂时不可用

这是一个自定义内核,我只是确保我在 RTC 支持中编译,但仍然没有运气。关于为什么会发生这种情况的任何想法?

【问题讨论】:

  • 这个嵌入式gentoo系统是否包含strace?也许strace 一个使用 time.time() 的小 python 脚本,看看系统调用出错了——这会让你知道问题出在哪里。
  • 基本安装中不包含任何 strace。已经想到了。
  • 处理器架构是什么?也许我们可以编译 strace bin(如果需要,可以静态编译)并将其复制到主机。如果有帮助,我有几个交叉编译链。

标签: python linux gentoo


【解决方案1】:

也许这是你的问题?

http://bugs.gentoo.org/show_bug.cgi?id=330937

编辑 C 测试代码

#include <stdio.h>
#include <sys/time.h>

typedef struct timeval _PyTime_timeval;

void _PyTime_gettimeofday(_PyTime_timeval *tp)
{
    /* There are three ways to get the time:
      (1) gettimeofday() -- resolution in microseconds
      (2) ftime() -- resolution in milliseconds
      (3) time() -- resolution in seconds
      In all cases the return value in a timeval struct.
      Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
      fail, so we fall back on ftime() or time().
      Note: clock resolution does not imply clock accuracy! */
#ifdef HAVE_GETTIMEOFDAY
#ifdef GETTIMEOFDAY_NO_TZ
    if (gettimeofday(tp) == 0)
        return;
#else /* !GETTIMEOFDAY_NO_TZ */
    if (gettimeofday(tp, (struct timezone *)NULL) == 0)
        return;
#endif /* !GETTIMEOFDAY_NO_TZ */
#endif /* !HAVE_GETTIMEOFDAY */
#if defined(HAVE_FTIME)
    {
        struct timeb t;
        ftime(&t);
        tp->tv_sec = t.time;
        tp->tv_usec = t.millitm * 1000;
    }
#else /* !HAVE_FTIME */
    tp->tv_sec = time(NULL);
    tp->tv_usec = 0;
#endif /* !HAVE_FTIME */
    return;
}


int main(int argc, char** argv) {
    _PyTime_timeval time;
    _PyTime_gettimeofday(&time);
    double tval = 0;
    tval = (double) time.tv_sec + time.tv_usec * 0.000001;

    printf("Time value was %f\n", tval);
}

如果我用 gcc -DHAVE_GETTIMEOFDAY testtime.c 编译它,我会得到一个工作时间输出,这就是 python 正在沸腾的内容。

也许在嵌入式平台上,您需要让 python 相信您的 c 库提供的时间函数是错误的,或者内核/C 库位中出现了问题

【讨论】:

  • 不,看起来不像。这是刚刚下载的 stage3 的全新安装,所以任何升级都没有问题。
  • 我取消了自动构建,所以也许这就是问题所在....我将尝试 2008.0(最后一个可用版本),看看有什么效果。
  • 您对 C 代码的熟悉程度如何? ^^我已经提取了上面的python时间函数,你可以编译它来看看你的C库是否有什么奇怪的——你说你正在使用嵌入式安装,也许它弄混了内核位或C库位
【解决方案2】:

它是否在您的自定义内核之前工作?启动到救援 CD,chroot 进入您的 gentoo 环境,然后运行您的脚本。如果它有效,那就是你的内核。这是我能做到的最具体的。

【讨论】:

  • 这是一个嵌入式系统,所以我必须使用自定义内核。没有选择以任何其他方式启动...
  • 什么样的嵌入式系统?您是否为它编译了正确的计时器模块?
  • 另外(您可能并非如此),一些嵌入式设备制造商在其网站上提供了 linux 内核。如果你这样做,请尝试使用该内核。 Gentoo 不应该在意,只要它是一个足够新的内核(我不知道,假设是 2.6.18 用于 funzies)
  • 我公司定制的板子。不确定计时器驱动程序,但我选择了“通用 RTC 支持”。那可能是我的问题;可能没有司机......
  • @Burton Samograd:如果你的公司成功了,你可以试着四处打听,看看正在使用什么类型的时钟。然后检查内核是否支持。
猜你喜欢
  • 2021-11-20
  • 2015-10-16
  • 1970-01-01
  • 2015-12-04
  • 2020-11-27
  • 2011-12-22
  • 2010-12-18
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多