Найти - Пользователи
Полная версия: Импорт сторонней библиотеки с помощью ctypes
Начало » Python для новичков » Импорт сторонней библиотеки с помощью ctypes
1
ogost
Всем привет! Прошу помощи, весь мозг сломал.
Имеется сторонняя библиотека, написанная на си++. Нужно вызвать функцию из этой либы, она возвращает 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'>
#кракозябры
#кракозябры
Объясните пожалуйста как дураку, как всё это сделать правильно?

ах да, извините, забыл упомянуть, что ос 64-битная линукс, python тоже 64-битный, как и либа. если быть точнее то ос убунту 15.04, python 2.7.9
Shaman
Если возвращается std::string - всё плохо. Увидеть бы шаблон функции из заголовка.
И, да, cast там похоже лишний.
ogost
#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();
};
}
Shaman
ctypes не работает с c++. Нужно сделать обёртку самим, или при помощи swig.
ogost
спасибо за указание в правильном направлении, пошел курить swig.
doza_and
ogost
пошел курить swig.
Бесполезно. Если нет исходников, то вы не сможете его использовать. Вообще если нет исходников библиотеки, то наиболее правильное решение ее выбросить и использовать библиотеку с исходниками.

Если хотите помучаться, то соберите еще одну динамическую библиотеку на С++ в которой импортуруйте функцию и выпустите C или С++ интерфейсы нужного вида.
Shaman
Для обёртки над динамической библиотекой достаточно заголовка интерфейса. ctypes, естественно, при использовании swig тут становится ненужным.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB