Форум сайта python.su
0
Всем привет! Прошу помощи, весь мозг сломал.
Имеется сторонняя библиотека, написанная на си++. Нужно вызвать функцию из этой либы, она возвращает JSON в ustring (судя по документации, исходников либы нет). В общем, нужно этот JSON как-нибудь заполучить и прочитать/провести манипуляции с ней.
Что я делаю:
from ctypes import * lib = CDLL('libName.so') checkapi = lib.checkApi # checkApi - это и есть та самая злосчастная функция, вывод которой мы хотим получить. checkapi.argtypes = [] # указанная функция не принимает аргументов checkapi.restype = c_wchar_p # это вроде как указатель на юникодовый стринг result = checkapi() print type(result) print cast(result, c_wchar_p).value
./testposapi.py
<type 'str'>
#кракозябры
#кракозябры
Отредактировано ogost (Апрель 22, 2016 10:40:03)
Офлайн
88
Если возвращается std::string - всё плохо. Увидеть бы шаблон функции из заголовка.
И, да, cast там похоже лишний.
Отредактировано Shaman (Апрель 22, 2016 11:47:16)
Офлайн
0
#include <string>
#include <ExportLib.h>
#ifdef WIN32
typedef std::wstring UString;
#else
typedef std::string UString;
#endif
using namespace std;
namespace numba_one {
class DLL_PUBLIC pol {
public:
static UString checkApi();
static UString getInformation();
static UString callFunction(UString funcName, UString param);
static UString put(UString param);
static UString sendData();
};
}
Офлайн
88
ctypes не работает с c++. Нужно сделать обёртку самим, или при помощи swig.
Офлайн
0
спасибо за указание в правильном направлении, пошел курить swig.
Офлайн
253
ogostБесполезно. Если нет исходников, то вы не сможете его использовать. Вообще если нет исходников библиотеки, то наиболее правильное решение ее выбросить и использовать библиотеку с исходниками.
пошел курить swig.
Офлайн
88
Для обёртки над динамической библиотекой достаточно заголовка интерфейса. ctypes, естественно, при использовании swig тут становится ненужным.
Офлайн