Работа с `PyQt5.QtCore.QLibrary` в Python: как привести` sip.voidptr` к функции? - PullRequest
3 голосов
/ 29 марта 2020

Я пытаюсь портировать (некоторые из) логи c из void QgsPluginManager :: getCppPluginsMetadata () из QGIS с C ++ на Python.

В C ++ соответствующий раздел выглядит следующим образом:

/* `lib` is a path (string) to a QGIS plugin shared object file, e.g. `/lib/qgis/plugins/libtopolplugin.so` */
QLibrary *myLib = new QLibrary( lib );
bool loaded = myLib->load();
if ( !loaded ) { /* handle error */ }
name_t *pName = ( name_t * ) cast_to_fptr( myLib->resolve( "name" ) );
if ( pName ) { QgsDebugMsg( "Plugin name: " + pName() ); }

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

В Python, попробовал следующее:

import sys
from PyQt5 import QtCore

lib = '/lib/qgis/plugins/libtopolplugin.so'
myLib = QtCore.QLibrary(lib)

loaded = myLib.load()
if not loaded:
    print("Failed to load library!")
    sys.exit()

print( myLib.resolve( "name" ) )
print( myLib.resolve( "name" )() )

print('The end.')

Я получил следующий вывод:

<sip.voidptr object at 0x7fa046b214b0>
Traceback (most recent call last):
  File "test_QLibrary.py", line 17, in <module>
    print( myLib.resolve( "name" )() )
TypeError: 'sip.voidptr' object is not callable

Имеет смысл, что я не могу вызвать sip.voidptr напрямую - мне нужно как-то привести его к функции. Возможно ли это (с помощью sip или других инструментов) в Python? Если да, то как?

...