gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:54 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

我为用 Assembly 编写的 map 制作应用程序编写附加组件。 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 和节点)。这些对象是我创建的用于向 IronPython 公开“事物”的 C++/cli 对象。

当调用C++/cli source->Execute(scope)行时,唯一的python行要运行的是 DrawingList.RequestData。

RequestData 采用委托(delegate)和数据类型。

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

我希望这就是您要找的。

关于C++\IronPython 集成示例代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3953910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com