Типы аргументов Python C ++ подпись - PullRequest
1 голос
/ 27 октября 2011

У меня есть 2 вопроса, оба относительно того, как аргументы между Python и C ++ смешиваются ... У меня есть функция в C ++, которую я вызываю из python, и моя функция принимает даты и строки.

Является ли питон str таким же, как C ++

class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >

А во-вторых, моей функции нужна дата типа class boost::gregorian::date, кто-нибудь знает, как я могу дать в python дату, которая будет читаться с правильной подписью?

Помощь высоко ценится! Я надеюсь, что это довольно простая проблема, я просто не очень разбираюсь в различных типах подписей (что не сулит ничего хорошего для моих текущих экспериментов по соединению Python и C ++)!

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Нет.Чтобы вызывать функции Python из C или C ++, вы должны использовать Python C API.В случае строки C ++ это будет означать сначала преобразование ее в строку Python с использованием PyString_FromStringAndSize( cppString.data(), cppString.size() ) и передачу результирующего PyObject.И если вы хотите вызвать произвольную функцию, вам придется использовать PyImport_Import для загрузки модуля, затем PyObject_GetAttrString, чтобы получить функцию (функции Python являются атрибутами, как и все остальное), затем используйте PyObject_CallObject длявызовите его, предварительно преобразовав все аргументы и поместив их в кортеж (все через функции в Python C API).

1 голос
/ 27 октября 2011

Предполагая, что вы используете boost::python, позвольте мне дать вам представление о том, как действовать в этих случаях.Вместо того, чтобы boost::python автоматически переносить вашу функцию, вы предоставляете свою собственную упаковку:

    namespace {

        void Foo_methodUsingDate( Foo* pointer, const object& dateObject )
        {
            boost::gregorian::date date = convertFromPython( dateObject );

            pointer->methodUsingDate( date );
        }
    }

    void wrap_Foo()
    {
        class_< Foo >( "Foo" )
            .def( "bar",
                & Foo::bar
                )
            .def( "foobar",
                & Foo::foobar
                )
            .def( "methodUsingDate",
                & Foo_methodUsingDate
                )
            ;
    }

Конечно, вам нужно предоставить метод, который преобразует boost::python::object в boost::gregorian::date объект.Вы должны решить, как справиться с этим.Например, вы можете предположить, что параметр представляет собой последовательность из трех целых чисел, или вы можете разрешить более сложный способ передачи параметров, или определить новый класс, который переносит григорианскую дату и весь ее метод и предоставляет его непосредственно Python.

Что касается вашего первого вопроса, при использовании boost::python std::string s автоматически преобразуются в / из строк Python.

...