Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 22, 2016 10:07:23

ogost
Зарегистрирован: 2016-04-21
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Импорт сторонней библиотеки с помощью ctypes

Всем привет! Прошу помощи, весь мозг сломал.
Имеется сторонняя библиотека, написанная на си++. Нужно вызвать функцию из этой либы, она возвращает 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

Отредактировано ogost (Апрель 22, 2016 10:40:03)

Офлайн

#2 Апрель 22, 2016 11:18:18

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Импорт сторонней библиотеки с помощью ctypes

Если возвращается std::string - всё плохо. Увидеть бы шаблон функции из заголовка.
И, да, cast там похоже лишний.

Отредактировано Shaman (Апрель 22, 2016 11:47:16)

Офлайн

#3 Апрель 22, 2016 11:22:46

ogost
Зарегистрирован: 2016-04-21
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Импорт сторонней библиотеки с помощью ctypes

#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();
};
}

Офлайн

#4 Апрель 22, 2016 11:46:13

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Импорт сторонней библиотеки с помощью ctypes

ctypes не работает с c++. Нужно сделать обёртку самим, или при помощи swig.

Офлайн

#5 Апрель 22, 2016 11:55:33

ogost
Зарегистрирован: 2016-04-21
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Импорт сторонней библиотеки с помощью ctypes

спасибо за указание в правильном направлении, пошел курить swig.

Офлайн

#6 Апрель 29, 2016 07:55:52

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Импорт сторонней библиотеки с помощью ctypes

ogost
пошел курить swig.
Бесполезно. Если нет исходников, то вы не сможете его использовать. Вообще если нет исходников библиотеки, то наиболее правильное решение ее выбросить и использовать библиотеку с исходниками.

Если хотите помучаться, то соберите еще одну динамическую библиотеку на С++ в которой импортуруйте функцию и выпустите C или С++ интерфейсы нужного вида.



Офлайн

#7 Апрель 29, 2016 20:07:29

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Импорт сторонней библиотеки с помощью ctypes

Для обёртки над динамической библиотекой достаточно заголовка интерфейса. ctypes, естественно, при использовании swig тут становится ненужным.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version