Pybytes_fromstring возвращает объект none

Мне было интересно, могу ли я получить некоторую помощь. Скажем, у меня есть следующая функция для сериализации объекта:

PyObject * CKKSwrapper::SerializeContext() {
    std::string s;
    std::ostringstream os(s);
    Serial::Serialize(m_cc, os, SerType::BINARY);

    const std::string tmp = os.str();
    const char *msg = tmp.c_str();
    std::cout << "Length of context: " << tmp.length() << "\n";
    return PyBytes_FromString(msg);
}

Файл модуля Boost имеет

BOOST_PYTHON_MODULE (pycrypto) {
    class_<pycrypto::CKKSwrapper>("CKKSwrapper")
        .def("SerializeContext", &pycrypto::CKKSwrapper::SerializeContext,
             return_value_policy<manage_new_object>());

где я управляю объектом.

Однако, когда я вызываю метод в Python, я получаю объект None, и на выходе получается

import pycrypto
a = pycrypto.SerializeContext()

a - это None, и я получаю Length of context: X на моей консоли

Можете ли вы попробовать заменить "\n" на std::endl? Причина в том, что std::endl очищает буфер, чтобы избежать частичного вывода.

unddoch 31.03.2021 02:17

Также обратите внимание, что использование PyBytes_FromString - очень плохая идея, если ваши данные сериализации могут содержать нулевые байты.

unddoch 31.03.2021 02:19

Попался! Спасибо! std::endl, так что на самом деле он выводит значение нормально. Что бы вы предложили вместо PyBytes_FromString? Я искал ресурсы memoryview, но большинство из них являются скорее поверхностным, поскольку на самом деле они не обсуждают, как создать его на C++, а затем передать его Python

Ian Quah 31.03.2021 02:22

Чтобы уточнить - вы подразумеваете под "Длина контекста: X" какое-то случайное число или букву "X" буквально? Я бы попытался просто вернуть объект std::string и позволить ускорению обрабатывать преобразование, я думаю, он поддерживается. Если нет, может быть, PyBytes_FromStringAndSize лучше подходит?

unddoch 31.03.2021 02:28

Ах, X случайное число. Проблема в том, что я пытаюсь отойти от строк (текущая реализация) и перейти к чему-то родному для Python в целях повышения скорости.

Ian Quah 31.03.2021 02:32

Если ваша проблема связана со скоростью, вы профилировали, чтобы увидеть, что на самом деле std :: string требует времени? Возможно, вы можете вообще пропустить преобразование в типы Python и работать с обернутыми типами C++. Конечно, это зависит от того, как вы впоследствии используете сериализованные данные.

unddoch 31.03.2021 13:13

Собственно, проблема не в самом std::string. Проблема в том, что на стороне Python мне нужно преобразовать его в байты для отправки через сокеты. Функция байтов занимает много времени, поэтому я решил, что если бы я мог преобразовать ее в байтовую форму на конце C++, мне бы не пришлось вызывать функцию bytes в Python.

Ian Quah 31.03.2021 18:20

Если вы работаете в Linux, вы можете передать fd сокета только функции C++, которая выполняет сериализацию + отправку без пересечения языковых барьеров. (Вероятно, есть способ сделать это в Windows, но я не знаком с написанием сетевого кода Windows)

unddoch 31.03.2021 18:54
0
8
21
0

Другие вопросы по теме