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

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

Я прочитал Встраивание Python в другое приложение , хотя, похоже, речь идет только о API C и плоских функциях C, а не о классах или объектах (если я что-то пропустил) и о его "Embedded 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 связывание, но я встречал шесть или семь лет , или new-ish (Python 2.6), но don Кажется, у вас нет документации и есть комментарии в списке вопросов, например «Кто-нибудь читает эти комментарии [sic]? Кто-нибудь работает над этим проектом?» , что не внушает оптимизма. Но, пожалуйста, не стесняйтесь включать специфичные для Delphi ответы, особенно если вы думаете, что они будут работать в комбинированном приложении D + CB. Я ценю все ответы, даже если они не совсем идеальны - я могу исследовать, мне просто нужны указатели, куда идти. Однако нативное решение C ++, вероятно, было бы идеальным, поскольку использование объектов, производных от VCL, имеет свои ограничения.

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

Ответы [ 3 ]

8 голосов
/ 10 августа 2010

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

1 голос
/ 10 августа 2010

Выставляет внутренние классы или инстанцированные объекты в Python как объекты легко, или API действительно C-style или flat / non-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 )
0 голосов
/ 10 августа 2010

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

...