1

我没有太多的运气来寻找一个很好的解释,解释什么是无效的参数错误以及什么会导致它们。

我目前正在使用的样本是

import sys
mylog="mylog.log"
sys.stdout = open(mylog,'w')
#lots of code
#.
#.
#.
#End of lots of code
from time import clock
print "blablabla",clock()

我在时钟线上收到 IOError Invalid Argument 错误。我也试过

print "blablabla\t%s"%clock()

有关此错误的任何信息都会有很大帮助。这些行在短期运行时工作得很好,只是在运行代码一段时间后它就中断了。我试图将缓冲区大小设置为 45-100 行之类的低值。

4

1 回答 1

3

我无法在我自己的计算机上重现这个确切的问题,所以我不能给出具体的建议,但这里有一些关于如何调试这类事情的一般性评论。

当您在 python 的 IOError 或 OSError 异常中看到“无效参数”时,这意味着解释器尝试进行系统调用,但失败并设置errno为 code EINVAL。(切线,python 真的不应该打印 errno 代码的数值 - 符号名称是标准化的,但数字不是。)您需要做的第一件事是找出它是哪个系统调用,以及最简单的方法这样做是在实用程序下运行您的strace程序,如下所示:

$ strace -f -o strace.log python yourscript.py [arguments...]

等待它失败,然后在文件中搜索strace.log“-1 E”(正是那个字符串)。你会发现这样的东西:

times({tms_utime=162, tms_stime=123, tms_cutime=0, tms_cstime=0}) = 1718279979
write(1, "2.85\n", 5)                   = -1 EINVAL (Invalid argument)

然后,您阅读失败的系统调用的手册页(man 2 write在本例中为“”)并查找 errno 代码名称(EINVAL在本例中),并查看它所说的错误。

在这种情况下,我强烈怀疑您在 Python 解释器或操作系统中发现了错误。“无效参数”是指它所说的 - 系统调用的输入参数之一具有无效值。你没有在你的脚本中做任何棘手的事情,所以要么解释器弄乱了它的系统调用,要么内核误解了解释器想要什么。

于 2010-07-13T18:08:42.287 回答