HexRx
Сен. 10, 2010 14:13:21
Собрал Boost под Python 3.1 и решил сделать модуль
Вот C++ код:
#include <boost/python.hpp>
using namespace boost::python;
char const* greet()
{
return "hello, world";
}
BOOST_PYTHON_MODULE(hello_ext)
{
def("greet", greet);
}
При попытке вызвать модуль из питона вылетает ошибка:
Traceback (most recent call last):
File "<string>", line 247, in run_nodebug
File "test.py", line 1, in <module>
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 30-31: invalid data
Вот питоновский код вызова:
import hello_ext
print(hello_ext.greet())
Собственно что я делаю не так? Под Python 2.6 все отлично пашет :)
Андрей Светлов
Сен. 12, 2010 02:21:05
Собственно, все так. И оно работает.
Что поломалось у вас - не знаю.
Как понимаю, boost собирали сами. Что говорять тесты?
Хотя бы примитивный
cd ./libs/python/example/quickstart
bjam –verbose-test test
HexRx
Сен. 12, 2010 12:58:12
Выполнил
Андрей Светлов
cd ./libs/python/example/quickstart
bjam –verbose-test test
Создался модуль extending.pyd, пробовал обратится к нему из питона, все отлично работает :D
Сделал копипаст extending.cpp в свой проект и все равно та же самая ошибка, наверно что то не так с настройками проекта в Visual Studio :/
Андрей Светлов
Сен. 12, 2010 13:10:12
bjam -d+2 -n test
не будет ничего запускать, зато покажет, с какими опциями компилировалось/линковалось.
В MSVC, насколько помню, можно было из менюшек настройки посмотреть получившиеся command line flags.
Сравните и найдите три отличия.
HexRx
Сен. 12, 2010 15:35:04
Андрей Светлов
bjam -d+2 -n test
Не нашел там упоминания о файле extending.pyd, выполнил “bjam -n test” и там его отыскал :)
Подкорректировал линкер под линковку bjam, но это нечего не дало.. Перерыл все настройки проекта - все равно нечего.. Пробовал вставлять свой код в extending.cpp и скомпилить с помощью bjam - модуль работает. Уже не знаю что и менять :|
upd: Залил свой проект в аттач (в проект включены необходимые инклуды для Boost Python). Пожалуйста гляньте :rolleyes:
Андрей Светлов
Сен. 12, 2010 16:20:27
Аттачи на этом форуме никогда не работали :)
Разница может быть в настройках компилятора, а не только линкера.
Первое, что приходит в голову - есть какой-то флажок касательно wchar_t.
Подробностей не помню.
Ваш проект мне ничего не даст - у меня linux, винды и студии нет, проверить не на чем.
Кстати, надеюсь вы используете VS 2008?
HexRx
Сен. 12, 2010 16:25:33
Андрей Светлов
Аттачи на этом форуме никогда не работали :)
Я уже заметил что они не работают :)
Андрей Светлов
Кстати, надеюсь вы используете VS 2008?
Конечно 2008 :D
Андрей Светлов
Первое, что приходит в голову - есть какой-то флажок касательно wchar_t.
Буду что то подобное искать :P
HexRx
Сен. 12, 2010 17:06:18
Ппц, слов нету.., проблема была настолько банальна - в пути к модулю были русские буквы :lol: :lol: :lol:
Андрей Светлов, спасибо что помогал с решением проблемы :)
Андрей Светлов
Сен. 12, 2010 21:03:50
Заработало - хорошо.
Только, кажется, проблема идентифицированна неверно. Все должно было пройти и с русскими буквами. Я когда-то проверял.
Единственное, чего питон не умеет - это работать с pyd названным по русски.
И не научится, наверное, никогда - точка входа это функция init<имя модуля>; кодировка исключительно ascii - по другому С/С++ не поймет.
Русский путь к файлу .pyd отрабатывает нормально.
HexRx
Сен. 12, 2010 22:37:38
Андрей Светлов, только что запустил модуль из англ папки - запустился, потом переименовал папку на русский - ошибка “UnicodeDecodeError: ‘utf8’ codec can't decode bytes in position 30-31: invalid data” =) Также работают и стандартные pyd.
Может быть такие проблемы только с виндой?