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 запускаться более одного раза в одном сеансе? Или другой способ избежать этой проблемы?

Я использую автономный дистрибутив PsychoPy версии 1.81.02, нетронутый. Проблема не специфична для IPython — ее также можно продемонстрировать из простого приглашения Python, если вы отключите sys.exit и дважды наберете execfile('gabor.py'):

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

person jez    schedule 06.02.2015    source источник
comment
есть pyglet.window.Window.close(), который удаляет весь контекст текущего окна, но его нужно запускать на объекте, который инициировал само окно. поэтому вам нужно поместить инициированный Window() в переменную и вызвать для нее .close(). Я предполагаю, что это мало поможет, поскольку вы запускаете его внутри какой-то оболочки?   -  person Torxed    schedule 13.03.2015


Ответы (1)


Я не знаю, как отменить всю инициализацию pyglet/psychopy - ни один из них на самом деле не предназначен для вас, поэтому здесь будет некоторая работа. Но я не уверен, что это хорошая идея запускать скрипты так, как вы это делаете.

Само приложение PsychoPy обходит это, запуская каждый скрипт в новом процессе. Это означает, что вы знаете, что пространство имен очищается при каждом запуске. Запуск вашего скрипта поверх предыдущего может привести к некоторым действительно трудно обнаруживаемым ошибкам, потому что вы не знаете, в каком состоянии предыдущий скрипт оставил память, графическую карту и пространство имен.

ура Джон

person Jon    schedule 09.02.2015
comment
Спасибо за ответ. Я и тысячи пользователей IPython не согласятся с тем, что работать таким образом — плохая идея — «I» означает «интерактивный», а сохранение переменных в памяти — это один из многих чрезвычайно мощных инструментов интерактивной отладки, встроенных в этот подход. Конечно, вы должны знать, как избежать описанной вами ошибки — ответ заключается в том, чтобы мыслить и программировать модульно в терминах объектов и функций, а не в терминах сценариев (то же самое относится и к Matlab, который также построен таким образом). Однако неудивительно, что pyglet — думаю, мне все равно придется использовать отдельные процессы. - person jez; 09.02.2015
comment
Ха-ха, да, я знаю, что i означает интерактивный. И я знаю, что тысячи людей любят программировать интерактивно. Я был одним из них. Получайте удовольствие от этого и не стесняйтесь отправлять код в проектPsychopy, если вы найдете способ делать то, что хотите. - person Jon; 10.02.2015