【问题标题】:Oct2Py gives "TypeError: cannot unpack non-iterable float object" with Psychtoolbox function returning multiple argumentsOct2Py 使用返回多个参数的 Psychtoolbox 函数给出“TypeError: cannot unpack non-iterable float object”
【发布时间】:2026-01-21 00:35:01
【问题描述】:

我正在使用 Oct2py 包从他们的站点运行一个非常基本的 Psychtoolbox 示例,当我尝试返回两个浮点值时,我遇到了一个问题,它看起来像:

from oct2py import octave
import sys

def ptb():
    # Clear the workspace and the screen
    octave.sca;
    octave.close;

    octave.PsychDebugWindowConfiguration; 

    # Here we call some default settings for setting up Psychtoolbox
    octave.PsychDefaultSetup(2);

    # Get the screen numbers. This gives us a number for each of the screens
    # attached to our computer.
    screens = octave.Screen('Screens');

    # To draw we select the maximum of these numbers. So in a situation where we
    # have two screens attached to our monitor we will draw to the external
    # screen.
    screenNumber = octave.max(screens);

    # Define black and white (white will be 1 and black 0). This is because
    # in general luminace values are defined between 0 and 1 with 255 steps in
    # between. All values in Psychtoolbox are defined between 0 and 1
    white = octave.WhiteIndex(screenNumber);
    black = octave.BlackIndex(screenNumber);

    # Do a simply calculation to calculate the luminance value for grey. This
    # will be half the luminace values for white
    grey = white / 2;

    # Open an on screen window using PsychImaging and color it grey.
    window, windowRect = octave.PsychImaging('OpenWindow', screenNumber, grey);

    # Now we have drawn to the screen we wait for a keyboard button press (any
    # key) to terminate the demo.
    octave.KbStrokeWait;

    # Clear the screen.
    octave.sca;
    
    sys.exit()
    
if __name__ == "__main__":
    ptb()

错误发生在第49行:

TypeError                                 Traceback (most recent call last)
<ipython-input-1-6e0dcd049170> in <module>
     47 
     48 if __name__ == "__main__":
---> 49     ptb()

<ipython-input-1-6e0dcd049170> in ptb()
     37 
     38     #Open an on screen window using PsychImaging and color it grey.
---> 39     window, windowRect = octave.PsychImaging('OpenWindow', screenNumber, grey);
     40 
     41     #Now we have drawn to the screen we wait for a keyboard button press (any

TypeError: cannot unpack non-iterable float object

我在网上寻找这个错误的帮助,但我看到的解释很少,没有一个能帮助我。当我在 Octave 中执行它时,它运行良好,但在 Python 中我遇到了这个问题,我试图在 window 和 windowRect 之间放置括号,但它也不起作用。我该如何继续呢?

【问题讨论】:

  • 一目了然,PsychImagine 是否有可能返回一个图形对象的句柄?你期望 window 和 windowRect 到底是什么?
  • 只是预感,mex 文件可能依赖于输出参数数量的自动检测,当通过 oct2py 调用时可能会失败。尝试通过 eval 语句运行它,在其中使用适当的 octave 语法指定两个输出参数,即octave.eval("[window, windowrect] = PsychImaging('OpenWindow', screenNumber, gray);")。如果您进一步需要它们(但听起来不像您那样),这些将可以在您的 octave 工作区中访问。 (PS:你确定灰色是正确的,不应该是字符串什么的吗?)。
  • 所以@TasosPapastylianou,在 Octave 中,这些变量接收两个不同的值,分别是一个双精度 1x1 和另一个双精度 1x4:window = 10windowRect = [0,0,1366,768],它们也是放在 Screen 方法中的参数(到显示图像,更改等等......)但在 Python 中,我正在等待它应该返回浮点值
  • @TasosPapastylianou 它终于奏效了!!!现在我正在阅读文档,以便如何从 Octave 变量中恢复值以在相同的 Python 代码中使用
  • 这也很简单。见这里:*.com/a/38543580/4183191

标签: python octave psychtoolbox oct2py


【解决方案1】:

将 cmets 转换为答案。

这里的问题是,当 oct2py 运行该行时,它的行为就像使用单个参数调用函数一样。 Oct2py 无法从 python 调用的输出数量推断参数的数量。 (显然,旧的 oct2py 版本曾经是这种情况,但现在不是了:请参阅this answer)。

正如链接的答案所暗示的那样,执行此操作的方法是将额外的 nout=2 参数传递给函数。 IE。你的电话(假设所有其他参数都是正确的?)应该是:

window, windowRect = octave.PsychImaging('OpenWindow', screenNumber, grey, nout=2);

或者,您可以使用“eval”以更自然的八度音阶语法运行您的函数,即

octave.eval("[window, windowRect] = PsychImaging('OpenWindow', screenNumber, grey);")

我注意到,在这种情况下,您实际上并不需要使用生成的输出变量,但如果您这样做了,您可以使用 oct2py 的 pull 函数将它们检索到您的 Python 会话中。

【讨论】: