Как мне встроить 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.