Невозможно импортировать пользовательскую DLL в python
Я пытаюсь выставить класс C ++ для Python сboost::python
так что я прохожуэтот урок, Я создал визуальную студию.dll
проект, с этим исходным кодом:
#include <boost/python.hpp>
using namespace boost::python;
struct World
{
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set)
;
}
И я построил его как 64-битную DLL. Следующий шаг в руководстве говорит:
Здесь мы написали оболочку класса C ++, которая предоставляет функции-члены greet и set. Теперь, после сборки нашего модуля в качестве разделяемой библиотеки, мы можем использовать наш класс World в Python. Вот пример сеанса Python:
>>> import hello
>>> planet = hello.World()
>>> planet.set('howdy')
>>> planet.greet()
'howdy'
Тем не менее, после запуска Python в том же каталоге и набравimport hello
я получил
>>> import hello
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'hello'
>>>
Я попытался переименовать файлы 'dll' вhello.dll
а также копированиекаждый выходной файл (dll
, exp
, ilk
, lib
, а такжеpdb
) чтобы%PYTHONPATH%\DLLs
, но я все еще не могу импортировать модуль в Python.
Много гуглинга привело меня кЭта статья рекомендую я используюctypes
импортироватьdll
, Это позволяет мне загрузитьdll
, но я все еще не могу назвать класс "Мир". Например:
>>> import ctypes
>>> mydll = ctypes.cdll.LoadLibrary("hello")
>>> mydll
<CDLL 'hello', handle 7fef40a0000 at 0x775ba8>
>>> hello = mydll.World()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files\Python35\lib\ctypes\__init__.py", line 360, in __getatt
r__
func = self.__getitem__(name)
File "C:\Program Files\Python35\lib\ctypes\__init__.py", line 365, in __getite
m__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'World' not found
>>>
Итак пара вопросов:
Можно ли импортироватьdll
в питонебез используя ctypes? Учебное пособие, кажется, указывает, что это так, но не предоставляет очень подробной информации о том, как правильно ввести dll в python.
Какие файлы мне нужны и где? Кажется, мне нужно толькоdll
Файл из Visual Studio в рабочем каталоге моей оболочки Python, но это явно не работает для меня.
Почему я не могу позвонитьWorld
через ctypes?
Некоторые более важные детали: я использую 64-разрядную версию Windows 7, 64-разрядную версию Python 3.5.2 и Visual Studio 2015 с Boost 1.61.