是否可以从非托管代码(如C++或Delphi)调用托管代码,特别是IronRuby或IronPython?
例如,我们有一个用Delphi编写的应用程序正在转移到C#.NET我们想在我们的新应用程序中提供Ruby或Python脚本来替换VBSCRIPT.但是,我们需要在旧的Delphi应用程序中提供Ruby/Python脚本.是否可以使用Delphi代码中IronRuby/IronPython提供的托管dll?
为什么你可以在不需要GIL但是Python(CPython)需要GIL的情况下运行Jython和IronPython?
编辑
好的,菜鸟在这里请耐心等待.我想问的是以下内容:
我认为更清楚地表明我正在寻找什么.任何在行业中使用这些技术的人的意见都会非常有帮助.
提前感谢您的见解.
我正在为我正在制作的游戏开发一些工具.这些工具可以作为使编辑游戏文件更容易的前端.其中一些文件是python脚本文件.例如,我有一个Items.py文件,其中包含以下内容(例如,最小化)
from ItemModule import *
import copy
class ScriptedItem(Item):
def __init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower):
Item.__init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower, Item.GetNextItemID())
def Clone(self):
return copy.deepcopy(self)
ItemLibrary.AddItem(ScriptedItem("Abounding Crystal", "A colourful crystal composed of many smaller crystals. It gives off a warm glow.", ItemType.SynthesisMaterial, ItemType.SynthesisMaterial, 0, ItemUsage.Unusable, 0, 50))
Run Code Online (Sandbox Code Playgroud)
正如我提到的,我想提供一个前端来编辑这个文件,而不需要编辑器直接知道python /编辑文件.我的编辑需要能够:
为此,我开始编写自己的解析器,查找类关键字以及何时使用这些记录的类来构造对象.这适用于简单的数据,但是当我开始使用具有复杂构造函数的类(列表,映射等)时,正确解析变得越来越困难.
在搜索之后,我发现IronPython可以很容易地解析python文件,所以这就是我要做的事情.一旦我构建了抽象语法树,我就使用PythonWalkers来识别和查找我需要的所有信息.这非常适合读取数据,但我没有看到将更新的数据推送到Python文件的简单方法.据我所知,没有办法改变AST中的值,更不用说将AST转换回脚本文件了.如果我错了,我会喜欢有人告诉我如何做到这一点.我现在需要做的是搜索文件直到找到正确的行,然后尝试将数据推送到构造函数中,确保正确的排序.
我有没有看到一些明显的解决方案?我应该继续处理我的解析器并使其支持更复杂的数据类型吗?我真的虽然我使用了IronPython解析器,但我没想到将修改后的数据推回文件是多么棘手.
任何建议,将不胜感激
我将IronPython嵌入到我的游戏引擎中,您可以在其中将脚本附加到对象.我不希望脚本能够随时访问CLR,因为它们几乎可以做任何事情.
拥有随机脚本,特别是从互联网上下载,能够打开互联网连接,访问用户硬盘或修改内部游戏状态是一件非常糟糕的事情.
通常人们会建议"使用单独的AppDomain".但是,除非我严重错误,否则跨AppDomains会很慢.非常慢.游戏引擎太慢了.所以我在寻找其他选择.
我想过编译一个自定义版本的IronPython会阻止你导入clr或任何命名空间,从而限制它到标准库.
我宁愿选择的选项如下:
__builtins__.__import__ = None #Stops imports working
reload = None #Stops reloading working (specifically stops them reloading builtins
#giving back an unbroken __import___!
Run Code Online (Sandbox Code Playgroud)
我在另一个堆栈溢出帖子中读到了这个.假设不是设置__ builtins_ ._ import__为none,我将其设置为自定义函数,允许您加载标准API.
问题是,使用上面概述的方法,脚本能否有任何方式能够访问clr模块,.net BCL或其他任何可能造成坏处的事情?或者我应该修改源代码?第三种选择?
VisualStudio 2012中是否支持IronPython?我没有在模板中找到IronPython项目.
下面的代码抛出'MissingMemberException'
ScriptEngine engine = Python.CreateEngine();
ScriptRuntime runtime = engine.Runtime;
ScriptScope scope = runtime.CreateScope();
string code = "emp.Name==\"Bernie\"";
ScriptSource source =
engine.CreateScriptSourceFromString(code, SourceCodeKind.Expression);
var emp = new {Name = "Bernie"};
scope.SetVariable("emp", emp);
var res = (double)source.Execute(scope);
Run Code Online (Sandbox Code Playgroud)
如果我声明一个名为'Employee'的类型并给它一个成员'Name',并使用它代替:
var emp = new Employee {Name = "Bernie"}
Run Code Online (Sandbox Code Playgroud)
它的工作方式与预期一致.有谁知道为什么它不适用于匿名类型,是否有解决方法?
尝试使用ironpython安装autopep8时出错:
ImportError: No module named logilab
Run Code Online (Sandbox Code Playgroud)
它失败的代码片段是:
def load_module(self, fullname):
self._reopen()
try:
mod = imp.load_module(fullname, self.file, self.filename, self.etc)
finally:
if self.file:
self.file.close()
# Note: we don't set __loader__ because we want the module to look
# normal; i.e. this is just a wrapper for standard import machinery
return mod
Run Code Online (Sandbox Code Playgroud)
使用解释器ipy64导入logilab并没有失败.我为文件名添加了一个print语句,它显示:
C:\Program Files (x86)\IronPython 2.7\Lib\site-packages\logilab_common-0.59.1-py2.7.egg\logilab
Run Code Online (Sandbox Code Playgroud)
该路径存在,它包含一个init .py,其中包含以下内容:
"""generated file, don't modify or your data will be lost"""
try:
__import__('pkg_resources').declare_namespace(__name__)
except ImportError:
pass
Run Code Online (Sandbox Code Playgroud)
我通过添加快速修复错误和脏
except ImportError:
mod = __import__(fullname)
Run Code Online (Sandbox Code Playgroud)
但由于我不知道可能产生的影响,我对这个问题没有很好的感觉.
现在,为什么使用imp.load_module失败了,使用 …
是否有可能在IronPython 64位上使用numpy?我尝试使用Enthought分发的软件包,但它们不起作用.
有什么建议吗?是否有任何项目正在努力让numpy与64位IronPython一起工作?
我正在使用IronPython从.net运行python脚本,下面是我的python脚本
import tensorflow as tf
print('Tensorflow Imported')
Run Code Online (Sandbox Code Playgroud)
下面是C#代码
using System;
using System.Text;
using System.IO;
using IronPython.Hosting;
using System.Collections.Generic;
using Microsoft.Scripting.Hosting;
namespace ConsoleApplication1
{
class Program
{
private static void Main()
{
var py = Python.CreateEngine();
List<string> searchPaths = new List<string>();
searchPaths.Add(@"C:\Users\Admin\AppData\Local\Programs\Python\Python35\Lib)");
searchPaths.Add(@"C:\Users\Admin\AppData\Local\Programs\Python\Python35\Lib\site-packages)");
py.SetSearchPaths(searchPaths);
try
{
py.ExecuteFile("script.py");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我的输出
意外的令牌“来自”
如果我删除import语句,则python脚本可以正常执行。我尝试过将os,sys所有这些导入,都没有任何问题。我已经通过pip安装了TensorFlow,当我通过python console(v3.5)运行以上脚本时,它可以正常工作。
更新:在TF文档中,其书面内容“ TensorFlow仅支持Windows上的Python版本3.5.x ”。但是IronPython的正式版本是2.7版,我很高兴在GitHub上找到IronPython ,并尝试构建它(我只是在控制台中键入build,然后对显示的错误消息列表感到惊讶!:D找不到预编译的错误消息!二进制文件
有什么其他方法可以在IronPython 2.7中导入tensorflow或在.net中运行Python?
ironpython ×10
python ×5
c# ×4
.net ×2
jython ×2
python-2.7 ×2
delphi ×1
embed ×1
gil ×1
import ×1
ironruby ×1
numpy ×1
parsing ×1
ptvs ×1
pyjamas ×1
python.net ×1
security ×1
tensorflow ×1
unmanaged ×1