Как мне встроить Python в приложение C++ Builder / Delphi 2010?

Я заинтересован в экспериментах по внедрению Python в мое приложение, чтобы позволить пользователю запускать скрипты Python в среде приложения, получать доступ к внутренним (реализованным на C++) объектам и т. Д. Я довольно новичок в этом, поэтому не знаю точно, что Я делаю.

Я прочитал " Внедрение Python в другое приложение", хотя, похоже, речь идет только о API C и плоских функциях C, а не о классах или объектах (если я что-то не пропустил), а его раздел "Встраивание Python в C++" содержит всего два предложения., Тем не менее, я также сталкивался с тем, как использовать boost::python, и это выглядит отлично.

Есть одна проблема: boost::python не поддерживается C++ Builder 2010.

Итак, учитывая это, каков наилучший подход для встраивания Python в приложение C++, скомпилированное с C++ Builder 2010, и, используя любую лучшую технику, как вы выставляете / интегрируете классы и объекты, чтобы предоставить кодировщику Python доступ к объекту? ориентированные внутренние программы? Я пропустил стандартный подход? Легко ли представить в Python внутренние классы или созданные объекты как объекты, или API действительно в стиле C или плоский / не-OO, и если да, то каков наилучший подход для имитации базового уровня OO через такой API?

Примечание: я на самом деле использую RAD Studio, которая включает в себя C++ Builder и Delphi. Может быть возможно использовать какое-то специфичное для Delphi связывание, но я столкнулся с тем, что ему шесть или семь лет, или он новый (Python 2.6), но , похоже, не имеет никакой документации и комментарии в списке вопросов типа "Кто-нибудь читает эти комментарии [sic]? Кто-нибудь работает над этим проектом?" что не внушает оптимизма Но, пожалуйста, не стесняйтесь включать специфичные для Delphi ответы, особенно если вы думаете, что они будут работать в комбинированном приложении D+CB. Я ценю все ответы, даже если они не совсем идеальны - я могу исследовать, мне просто нужны указатели, куда идти. Однако нативное решение C++, вероятно, было бы идеальным, поскольку использование объектов, производных от VCL, имеет свои ограничения.

Спасибо за ваш вклад!

3 ответа

Решение

Вы не должны бояться проекта P4D в группах Google. Это кажется неактивным, потому что, отчасти, это очень стабильно и полнофункционально уже. Эти компоненты используются в гораздо более активном приложении PyScripter, которое в настоящее время является одним из лучших редакторов Python для разработки. PyScripter написан на Delphi и использует компоненты P4D. Как таковой, он также представляет очень полный пример того, как использовать компоненты P4D, хотя примеры, предоставленные с проверкой источника P4D, уже достаточно хороши, чтобы начать.

Легко ли представить в Python внутренние классы или созданные объекты как объекты, или API действительно в стиле C или плоский / не-OO, и если да, то каков наилучший подход для имитации базового уровня OO через такой API?

Вы уже ответили сами. Последняя часть предложения верна.

Объекты и классы не существуют в C++, как только вы компилируете, только несколько структур (vtables), а также другие, объясняющие некоторые данные ОО, при условии, что RTTI активирован. Вот почему невозможно преодолеть разрыв между Python и C++, используя классы и объекты.

Вы можете сделать это самостоятельно, создав набор функций C вместе с некоторыми структурами данных, а затем OO-слой. Но вы не можете сделать это из коробки.

Например, класс Car:

class Car {
public:
  int getDoors()
      { return this->doors; }
protected:
  int doors;
};

Переводится на:

struct Car {
    int doors;
};

int Car_getDoors(Car * this)
{
    return this->doors;
}

И звонок в getDoors:

 c->getDoors()

Переводится как:

Car_getDoors( c )

Вы можете создавать оболочки от C++ до $SCRIPTLANG с помощью swig.

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