在运行两次PsychoPy演示时,pyglet“无法共享上下文”异常

时间:2015-02-06 17:41:40

标签: pyglet psychopy

PsychoPy看起来就像我需要的那样。但我想使用我自己的开发环境(一个简单的IPython提示与我选择的编辑器相结合)而不是提供的IDE。

麻烦的是你似乎必须退出Python并在每次PsychoPy运行后重新启动。例如,如果cd...../demos/coder/stimuli目录并输入run gabor.py它运行正常,但如果我再次输入run gabor.py,我会从pyglet获得此异常:

C:\snap\PsychoPy2\lib\site-packages\pyglet\window\win32\__init__.pyc in _create(self)
    259         if not self._wgl_context:
    260             self.canvas = Win32Canvas(self.display, self._view_hwnd, self._dc)
--> 261             self.context.attach(self.canvas)
    262             self._wgl_context = self.context._context
    263

C:\snap\PsychoPy2\lib\site-packages\pyglet\gl\win32.pyc in attach(self, canvas)
    261         self._context = wglext_arb.wglCreateContextAttribsARB(canvas.hdc,
    262             share, attribs)
--> 263         super(Win32ARBContext, self).attach(canvas)

C:\snap\PsychoPy2\lib\site-packages\pyglet\gl\win32.pyc in attach(self, canvas)
    206                 raise RuntimeError('Share context has no canvas.')
    207             if not wgl.wglShareLists(share._context, self._context):
--> 208                 raise gl.ContextException('Unable to share contexts')
    209
    210     def set_current(self):

ContextException: Unable to share contexts 

是否有某种pyglet.cleanup()我可以调用(类似于pygame.quit())以允许PsychoPy脚本在同一会话中运行多次?还是其他避免这个问题的方法?

我使用Standalone PsychoPy发行版1.81.02,未触动过。问题不是IPython特有的 - 如果你禁用sys.exit并输入execfile('gabor.py')两次,它也可以从普通的Python提示中进行演示:

C:\snap\PsychoPy2\Lib\site-packages\PsychoPy-1.81.02-py2.7.egg\psychopy\demos\coder\stimuli>python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import sys; sys.exit = lambda x:x
>>> execfile('gabor.py')
0.6560  WARNING         Movie2 stim could not be imported and won't be available
1.6719  WARNING         Monitor specification not found. Creating a temporary one...
>>>
>>> execfile('gabor.py')
Traceback (most recent call last):
[snip]
  File "C:\snap\PsychoPy2\lib\site-packages\pyglet\gl\win32.py", line 208, in attach
    raise gl.ContextException('Unable to share contexts')
pyglet.gl.ContextException: Unable to share contexts

1 个答案:

答案 0 :(得分:0)

我不知道如何撤消所有pyglet / psychopy初始化 - 两者都不是真的为你设计的,所以这里会有一些工作。但是我不确定以你的方式运行脚本是个好主意。

PsychoPy应用程序本身可以通过在新进程中启动每个脚本来解决问题。这意味着您知道每次运行时命名空间都是干净的。在上一个脚本之上运行脚本会导致一些非常难以发现的错误,因为您不知道前一个脚本在什么状态下会留下内存,图形卡和命名空间。

欢呼声 乔恩