Как я могу получить возвращаемое значение вызова метода класса Python из С++, используя PyBind11?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу получить возвращаемое значение вызова метода класса Python из С++, используя PyBind11?

Сообщение Anonymous »

У меня есть класс cpp, интерфейс которого выглядит следующим образом:

Код: Выделить всё

class Task {
public:
Task(std::string prefix, std::vector children = {}) : prefix(prefix), children(children), parent(nullptr) {

}

virtual void execute(std::shared_ptr context) = 0;

virtual void resolveKeys() = 0;

virtual std::tuple createTask(
tf::Executor& executor,
tf::Taskflow& taskflow,
std::shared_ptr context,
std::shared_ptr predecessor = nullptr
) = 0;

virtual void getInputs(std::set& out) = 0;

virtual void getOutputs(std::set& out) = 0;

void setParent(Task* parent) {
this->parent = parent;
for (const auto& child : children) {
child->setParent(this);
}
}
protected:
Task* parent = nullptr;
std::string prefix;
std::vector children;
};
И я хочу сделать так, чтобы люди могли определять классы Python, которые можно запускать из C++ с помощью PyBind11. У меня есть привязки Python, которые выглядят так:

Код: Выделить всё

class PyTask : public nemo::Task {
public:
PyTask() : Task("", {}) {};

// Override pure virtual method
void resolveKeys() override {
PYBIND11_OVERRIDE_PURE(
void,         // Return type
Task,         // Parent class
resolveKeys  // Name of function in C++ (must match Python)
);
}

void getInputs(std::set& out) override {
PYBIND11_OVERRIDE_PURE(
void,         // Return type
Task,         // Parent class
getInputs,  // Name of function in C++ (must match Python)
out
);
}

void getOutputs(std::set& out) override {
PYBIND11_OVERRIDE_PURE(
void,         // Return type
Task,         // Parent class
getOutputs,  // Name of function in C++ (must match Python)
out
);
}

// Override pure virtual method
void execute(std::shared_ptr context) override {
PYBIND11_OVERRIDE_PURE(
void,         // Return type
Task,         // Parent class
execute,      // Name of function in C++
context       // Arguments
);
}

std::tuple createTask(
tf::Executor& executor,
tf::Taskflow& taskflow,
std::shared_ptr context,
std::shared_ptr predecessor = nullptr
) override {
auto t = std::make_shared(taskflow.emplace([this, context]() {
this->execute(context);
}));
t->name(resolveName("PyTask"));
return std::make_tuple(t, t);
}
};
и пример класса Python, реализующего этот интерфейс, например:

Код: Выделить всё

class KeepResults(pynemo.Task):

def __init__(self):
pynemo.Task.__init__(self)
self.results = []

def resolveKeys(self):
pass

def getInputs(self, out: set[str]):
return {"test_value"}

def getOutputs(self, out: set[str]):
return set()

def execute(self, context: pynemo.DataStore):
return
И этот набор передается методам getInputs и getOutputs, но набор на стороне c++ не изменяется при добавлении к набору out в getInputs.
Я думаю, что вместо этого мне нужно сделать так, чтобы класс Python возвращал набор для методов getInputs и getOutputs, а затем перебирал метод элементы в py::set и обновите std::set, но я не уверен, как вызвать этот метод класса из С++ и как получить возвращаемое значение.< /p>
Как мне вызвать метод класса из C++ с помощью pybind11 и получить возвращаемое значение?

Подробнее здесь: https://stackoverflow.com/questions/791 ... using-pybi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»