Мне было интересно, могу ли я получить некоторую помощь. Скажем, у меня есть следующая функция для сериализации объекта:
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 на моей консоли
Также обратите внимание, что использование PyBytes_FromString - очень плохая идея, если ваши данные сериализации могут содержать нулевые байты.
Попался! Спасибо! std::endl, так что на самом деле он выводит значение нормально. Что бы вы предложили вместо PyBytes_FromString? Я искал ресурсы memoryview, но большинство из них являются скорее поверхностным, поскольку на самом деле они не обсуждают, как создать его на C++, а затем передать его Python
Чтобы уточнить - вы подразумеваете под "Длина контекста: X" какое-то случайное число или букву "X" буквально? Я бы попытался просто вернуть объект std::string и позволить ускорению обрабатывать преобразование, я думаю, он поддерживается. Если нет, может быть, PyBytes_FromStringAndSize лучше подходит?
Ах, X случайное число. Проблема в том, что я пытаюсь отойти от строк (текущая реализация) и перейти к чему-то родному для Python в целях повышения скорости.
Если ваша проблема связана со скоростью, вы профилировали, чтобы увидеть, что на самом деле std :: string требует времени? Возможно, вы можете вообще пропустить преобразование в типы Python и работать с обернутыми типами C++. Конечно, это зависит от того, как вы впоследствии используете сериализованные данные.
Собственно, проблема не в самом std::string. Проблема в том, что на стороне Python мне нужно преобразовать его в байты для отправки через сокеты. Функция байтов занимает много времени, поэтому я решил, что если бы я мог преобразовать ее в байтовую форму на конце C++, мне бы не пришлось вызывать функцию bytes в Python.
Если вы работаете в Linux, вы можете передать fd сокета только функции C++, которая выполняет сериализацию + отправку без пересечения языковых барьеров. (Вероятно, есть способ сделать это в Windows, но я не знаком с написанием сетевого кода Windows)






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