Выполнение скрипта PyQt4 более одного раза внутри REAPER приводит к ошибке SIP - PullRequest
0 голосов
/ 02 октября 2018

Некоторый контекст: REAPER - это цифровая звуковая рабочая станция, которая имеет расширенный API сценариев с привязками Lua, Python, C / C ++ и EEL.Я не нашел много информации о том, как он обрабатывает Python внутри.На первый взгляд, конфигурация включает указание на библиотеку Python где-нибудь в системе.Снимок экрана

Проблема: Я попытался запустить измененную версию скрипта PyQt4, найденную здесь внутри REAPER.Сначала он работал отлично

При последующих запусках того же сценария, однако, выскочила ошибка:

 Traceback (most recent call last):
  File "pyqt_test.py", line 2, in <module>
    from PyQt4 import QtGui
RuntimeError: the sip module has already registered a module called PyQt4.QtCore

Перезапуск REAPER решает проблему для другого отдельного запуска сценария, прежде чем снова показывать ту же ошибку.

Поиск проблемы не помог.В списке рассылки PyQt есть одно сообщение , в котором упоминается ошибка, и что решение включало файл пакета __init__, но никакой другой разработки.

Вот модифицированный скрипт, который я запускаю:

import sys
from PyQt4 import QtGui

def main():
    sys.argv = [] # necessary because for some reason argv doesnt exist when the script is run inside REAPER

    app = QtGui.QApplication(sys.argv)
    widget = QtGui.QWidget()
    layout = QtGui.QGridLayout()

    buttons = {}

    for i in range(16):
        for j in range(16):
            # keep a reference to the buttons
            buttons[i, j] = QtGui.QPushButton('row %d, col %d' % (i, j))
            # add to the layout
            layout.addWidget(buttons[i, j], i, j)

    widget.setLayout(layout)
    widget.show()
    app.exit(app.exec_())

if __name__ == '__main__':
    RPR_defer('main()') # RPR_defer runs supplied code in REAPER's GUI thread.

Есть идеи о том, что происходит и как его обойти / решить?

1 Ответ

0 голосов
/ 04 апреля 2019

Существует известная ошибка при импорте внешних библиотек более одного раза с помощью Python ReaScript API.Это также происходит с numpy (и, следовательно, со всеми библиотеками, которые зависят от него).

Я работаю над тем, чтобы решить эту проблему, написав библиотеку reapy.Это позволяет вызывать функции ReaScript API из-за пределов REAPER (например, в обычном терминале) и, таким образом, безопасно импортировать любые сторонние библиотеки (включая PyQt4).Вы можете проверить документацию или репозиторий , если вам интересно!

...