Я создаю DLL, написанную на C ++, функция экспорта возвращает PyObject *. Затем я использую ctypes для импорта DLL в Python. Теперь, как я могу получить настоящий PyObject ??
Вот некоторая часть кода C ++:
PyObject* _stdcall getList(){
PyObject * PList = NULL;
PyObject * PItem = NULL;
PList = PyList_New(10);
vector <int> intVector;
int i;
for(int i=0;i<10;i++){
intVector.push_back(i);
}
for(vector<int>::const_iterator it=intVector.begin();it<intVector.end();it++){
PItem = Py_BuildValue("i", &it);
PyList_Append(PList, PItem);
}
return PList;
}
и немного кода на Python:
dll = ctypes.windll.LoadLibrary(DllPath)
PList = dll.getList()
*Я хочу получить реальный список питонов, содержащий 1,2,3,4 … 10? *
Я чист ?? Спасибо заранее
У вас есть ряд проблем с вашим кодом, некоторые модификации:
#include <Python.h>
#include <vector>
extern "C" PyObject* _stdcall getList(){
PyObject *PList = PyList_New(0);
std::vector <int> intVector;
std::vector<int>::const_iterator it;
for(int i = 0 ; i < 10 ; i++){
intVector.push_back(i);
}
for(it = intVector.begin(); it != intVector.end() ; it++ ){
PyList_Append(PList, Py_BuildValue("i", *it));
}
return PList;
}
скомпилируйте это:
> g++ -Wall -shared lib.cpp -I \Python27\include -L \Python27\libs -lpython27 -o lib.dll -Wl,--add-stdcall-alias
Теперь вы можете загрузить его как любую функцию и установить getList
тип возврата py_object
как:
import ctypes
lib = ctypes.WinDLL('lib.dll')
getList = lib.getList
getList.argtypes = None
getList.restype = ctypes.py_object
getList()
Попробуй это:
>>> import ctypes
>>>
>>> lib = ctypes.WinDLL('lib.dll')
>>>
>>> getList = lib.getList
>>> getList.argtypes = None
>>> getList.restype = ctypes.py_object
>>> getList()
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
>>>
С Visual Studio и Python 64 бит:
1- Создайте пустой проект Win32 (тип DLL)
2- Щелкните правой кнопкой мыши на вашем проекте решения -> Configuration Manager.
3- Конфигурация активного решения (выпуск)
4- Active Solution Platform -> New, затем в нижнем выпадающем списке выберите x64 -> OK.
5- В папке с исходными файлами добавьте пустой файл C ++
6- Поместите свой код C ++ (одна из модификаций для распознавания getList)
#include <Python.h>
#include <vector>
extern "C" __declspec(dllexport) PyObject* _stdcall getList();
PyObject* _stdcall getList(){PyObject *PList = PyList_New(0);
std::vector <int> intVector;
std::vector<int>::const_iterator it;
for (int i = 0; i < 10; i++){
intVector.push_back(i);
}
for (it = intVector.begin(); it != intVector.end(); it++){
PyList_Append(PList, Py_BuildValue("i", *it));
}
return PList;
}
Я не совсем понимаю, что вы спрашиваете. Но я полагаю, вы хотите спросить, что вы можете сделать сейчас со своей DLL.
Что ж, для того, чтобы использовать его надлежащим образом, вам нужно будет создать специальную DLL, которую можно напрямую импортировать как модуль в Python. Чтобы определить, что делать, чтобы использовать это, лучше всего взглянуть на другие модули, как они это делают. Например MySQLdb
может быть кандидатом.
Короче говоря, у вас есть эта DLL-оболочка, вызывающая вашу функцию.
Но если у меня есть второй взгляд на ваш вопрос сейчас, я вижу, что вы пытаетесь загрузить свою DLL через ctypes
, Это также жизнеспособно, может быть, даже лучше, и вам придется использовать ctypes.py_object
тип данных.