C++\IronPython 集成示例代码?

Posted

技术标签:

【中文标题】C++\\IronPython 集成示例代码?【英文标题】:C++\IronPython integration example code?C++\IronPython 集成示例代码? 【发布时间】:2010-10-17 15:38:34 【问题描述】:

我正在寻找 C++\IronPython 集成简单示例代码,即将 python 代码嵌入到 C++ 或更好的 Visual C++ 程序中。 p>

示例代码应包括:如何在语言之间共享对象,如何来回调用函数\方法等...

此外,明确的设置程序也会有所帮助。 (如何在 Visual Studio 等中包含 Python 运行时 dll...)

我找到了一个很好的 C#\IronPython here 示例,但找不到 C++\IronPython 示例代码。

【问题讨论】:

不是一个完整的答案,但您可能想要 COM 互操作。在 C++ 代码和 C# 类库中定义相同的接口。让该接口成为您在作用域、引擎、执行代码和 ObjectOperations 类方面所需的薄包装器。当然,您需要在 C++ 端对对象进行生命周期管理。您可以承载 CLR 或直接将 .NET 程序集注册为 COM 对象。然后你只需从 C++ 端 CoCreate 它,现在你就可以与 IronPython 对话了。 【参考方案1】:

更新 - 我写了一个更通用的例子(加上一个包含整个 VS2008 项目的 zip 文件的链接)作为我博客上的条目here.

抱歉,我来得太晚了,但这是我将 IronPython 集成到 Visual Studio 2008 - .net 3.5 中的 C++/cli 应用程序中的方法。 (实际上是 C/C++ 的混合模式应用)

我为一个用 Assembly 编写的地图制作应用程序编写插件。该 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)。这些对象是我创建的用于向 IronPython 公开“事物”的 C++/cli 对象。

当调用 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)

我希望这就是你要找的。​​p>

【讨论】:

不确定这里的礼仪。我回家建了一个独立的例子。然后我添加了一个关于它的博客条目 (oldschooldotnet.blogspot.com/2011/04/…) - 加上一个指向包含整个 VS2008 项目的 tha zip 文件的链接。我在帖子顶部放置了一个链接,但是既然我有一个更好的例子,我会/应该重写答案吗?【参考方案2】:

如果您不需要 .NET 功能,您可以依赖嵌入 Python 而不是 IronPython。有关更多信息和示例,请参阅Embedding Python in Another Application 上的 Python 文档。如果你不介意依赖BOOST,你可以试试它的Python integration library。

【讨论】:

以上是关于C++\IronPython 集成示例代码?的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 错误:org.hibernate.HibernateException: Unable to get the default Bean Validation factory(示例代

安卓编译出错: Process 'command 'C:Javajdk1.8.0_51injava.exe'' finished with non-zero (示例代

AUTO Uninstaller卸载CAD/3DSMAX/INVENTOR时卡住/卡在 C:Program FilesCommon FilesAutodesk SharedXXXX.dll(示例代

RuntimeError: Failed to init API, possibly an invalid tessdata path: C:UsersylpPycharmProjectsun(示例代

RPC 编程语言 C

The return type is incompatible with JspSourceDependent.getDependants():JasperException问题分析与解决方法(示例代