как бороться с PyObject * из C ++ в Python

0

Я создаю 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()

* Я хочу получить настоящий список python, содержащий 1,2,3,4... 10? * Я ясно? Спасибо заранее

  • 3
    Почему бы не закончить написание модуля вместо использования ctypes?
  • 0
    потому что я не знаю, что делать дальше ... в то время
Показать ещё 1 комментарий
Теги:
dll
ctypes
pyobject

3 ответа

4

У вас есть ряд проблем с кодом, некоторые изменения:

#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]
>>>
>>>
  • 0
    спасибо заранее! учусь у вас, я изменяю свой код, но, наконец, возвращаю список Python вроде "[" .btw, я использую vs2010 для создания lib.dll. Это метер ??
  • 0
    Я нашел решение своей проблемы. Я передаю список pyobject в качестве параметра функции c ++, в функции я добавляю элементы в список. Наконец то работает
Показать ещё 1 комментарий
1

С Visual Studio и Python 64 бит:
1- Создать пустой проект Win32 (тип DLL)
2- Щелкните правой кнопкой мыши на своем проекте решения → Configuration Manager
3- Конфигурация активного решения (Release)
4- Платформа активного решения → Новая, затем в нижней части раскрывающегося списка выберите 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;
}
0

Я не совсем понимаю, о чем вы спрашиваете. Но я полагаю, вы хотите спросить, что вы можете сделать теперь со своей DLL.

  1. Ну, чтобы правильно использовать его, вам нужно будет создать специальную DLL, которая может быть импортирована как модуль в Python. Чтобы определить, что делать, чтобы использовать это, вам лучше всего искать другие модули, как они это делают. E. g. MySQLdb может быть кандидатом.

    Короче говоря, у вас есть эта "оберточная" DLL-функция.

  2. Но если у меня есть второй взгляд на ваш вопрос сейчас, я вижу, что вы пытаетесь загрузить свою DLL через ctypes. Это также ctypes.py_object, возможно, даже лучше, и вам придется использовать ctypes.py_object данных ctypes.py_object.

  • 0
    Я использую "ctypes.py_object", и это работает. взволнован ~ Большое спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню