Я пытаюсь портировать (некоторые из) логи 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? Если да, то как?