Пример кода интеграции C ++ \ IronPython? - PullRequest
5 голосов
/ 17 октября 2010

Я ищу простой пример кода для интеграции C ++ \ IronPython , то есть встраивание кода Python в C ++ или, что еще лучше, в программу Visual C ++.

Пример кода должен включать: как обмениваться объектами между языками, как вызывать функции \ методы назад и вперед и т. Д. *

Также может помочь и явная процедура установки.(Как включить библиотеку времени выполнения Python в Visual Studio и т.д ...)

Я нашел хороший пример для C # \ IronPython здесь , но не смог найти пример C ++ \ IronPythonкод.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

ОБНОВЛЕНИЕ - я написал более общий пример (плюс ссылку на zip-файл, содержащий весь проект VS2008) в виде записи в моем блоге здесь.

Извините, я так опаздываю к игре, но вот как я интегрировал IronPython в приложение C ++ / cli в Visual Studio 2008 - .net 3.5. (на самом деле приложение в смешанном режиме с C / C ++)

Я пишу дополнения к приложению для создания карт, написанному на ассемблере. API доступен для написания надстроек на C / C ++. Я смешиваю C / C ++ с C ++ / cli. Некоторые элементы из этого примера взяты из API (например, XPCALL и CmdEnd () - пожалуйста, просто игнорируйте их)

///////////////////////////////////////////////////////////////////////
void XPCALL PythonCmd2(int Result, int Result1, int Result2) 
{
  if(Result==X_OK)
  {
        try
        {
              String^ filename = gcnew String(txtFileName);
              String^ path = Assembly::GetExecutingAssembly()->Location;
              ScriptEngine^ engine = Python::CreateEngine();
              ScriptScope^ scope = engine->CreateScope();
              ScriptSource^ source = engine->CreateScriptSourceFromFile(String::Concat(Path::GetDirectoryName(path), "\\scripts\\", filename + ".py"));

              scope->SetVariable("DrawingList", DynamicHelpers::GetPythonTypeFromType(AddIn::DrawingList::typeid));
              scope->SetVariable("DrawingElement", DynamicHelpers::GetPythonTypeFromType(AddIn::DrawingElement::typeid));
              scope->SetVariable("DrawingPath", DynamicHelpers::GetPythonTypeFromType(AddIn::DrawingPath::typeid));
              scope->SetVariable("Node", DynamicHelpers::GetPythonTypeFromType(AddIn::Node::typeid));

              source->Execute(scope);
        }
        catch(Exception ^e)
        {
              Console::WriteLine(e->ToString());
              CmdEnd();
        }
  }
  else
  {
        CmdEnd();
  }
}
///////////////////////////////////////////////////////////////////////////////

Как видите, я выставляю IronPython некоторые объекты (DrawingList, DrawingElement, DrawingPath & Node). Эти объекты являются объектами C ++ / cli, которые я создал, чтобы представить «вещи» IronPython.

Когда вызывается строка C ++ / cli source-> Execute (scope), единственная строка python запустить - DrawingList.RequestData.

RequestData принимает делегата и тип данных.

Когда код C ++ / cli готов, он вызывает делегата, указывающего на функция "бриллиант"

В функции diamond извлекает запрошенные данные при вызове DrawingList.RequestedValue () Вызов DrawingList.AddElement (dp) добавляет новый элемент в визуальную базу данных приложений.

И, наконец, вызов DrawingList.EndCommand () сообщает движку FastCAD очистите и завершите работу плагина.

import clr
def diamond(Result1, Result2, Result3):

  if(Result1 == 0):

    dp = DrawingPath()
    dp.drawingStuff.EntityColor = 2
    dp.drawingStuff.SecondEntityColor = 2

    n = DrawingList.RequestedValue()

    dp.Nodes.Add(Node(n.X-50,n.Y+25))
    dp.Nodes.Add(Node(n.X-25,n.Y+50))
    dp.Nodes.Add(Node(n.X+25,n.Y+50))
    dp.Nodes.Add(Node(n.X+50,n.Y+25))
    dp.Nodes.Add(Node(n.X,n.Y-40))

    DrawingList.AddElement(dp)

  DrawingList.EndCommand()

DrawingList.RequestData(diamond, DrawingList.RequestType.PointType)

Надеюсь, это то, что вы искали.

1 голос
/ 17 октября 2010

Если вам не нужна функциональность .NET, вы можете рассчитывать на встраивание Python вместо IronPython.См. Документацию Python по Встраивание Python в другое приложение для получения дополнительной информации и примера.Если вы не против того, чтобы зависеть от BOOST , вы можете попробовать библиотеку интеграции Python .

...