想象一下,您需要开发和安排应用程序/脚本来执行以下操作: -
你会用什么?
在过去,我已经创建了上述的小型控制台应用程序,但它看起来有点笨拙和矫枉过正.
我想像PowerShell或IronPython这样的东西可能更合适.
有什么建议?
我在C#中嵌入了IronPython 2.0.在IronPython中,我用以下内容定义了自己的异常:
def foobarException(Exception):
pass
Run Code Online (Sandbox Code Playgroud)
并将其提升到某个地方:
raise foobarException( "This is the Exception Message" )
Run Code Online (Sandbox Code Playgroud)
现在在C#中,我有:
try
{
callIronPython();
}
catch (Exception e)
{
// How can I determine the name (foobarException) of the Exception
// that is thrown from IronPython?
// With e.Message, I get "This is the Exception Message"
}
Run Code Online (Sandbox Code Playgroud) 我需要移植一些代码,这些代码严重依赖于从CPython应用程序到IronPython的lxml.
lxml非常Pythonic,我想在IronPython下继续使用它,但它依赖于libxslt和libxml2,它们是C扩展.
有没有人知道在IronPython下允许lxml或没有那些C-extension依赖项的lxml版本的变通方法?
有谁知道IronPython 2.6是否计划支持pdb.set_trace()以启用ironpython模块中的断点?如果没有,是否有人建议在没有pdb的情况下完成此操作?
我正在尝试使用IronPython作为C#GUI和一些C#库之间的中介,以便它可以在编译后编写脚本.
我有一个类库DLL,由GUI和python使用,是这样的:
namespace MyLib
{
public class MyClass
{
public string Name { get; set; }
public MyClass(string name)
{
this.Name = name;
}
}
}
Run Code Online (Sandbox Code Playgroud)
IronPython代码如下:
import clr
clr.AddReferenceToFile(r"MyLib.dll")
from MyLib import MyClass
ReturnObject = MyClass("Test")
Run Code Online (Sandbox Code Playgroud)
然后,在C#中,我将其称为如下:
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = null;
scope = engine.CreateScope();
ScriptSource source = engine.CreateScriptSourceFromFile("Script.py");
source.Execute(scope);
MyClass mc = scope.GetVariable<MyClass>("ReturnObject ")
Run Code Online (Sandbox Code Playgroud)
当我调用最后一段代码时,source.Execute(scope)运行成功返回,但是当我尝试GetVariable调用时,它抛出以下异常
Microsoft.Scripting.ArgumentTypeException: expected MyClass , got MyClass
Run Code Online (Sandbox Code Playgroud)
所以,你可以看到类名完全相同,但由于某种原因,它认为它们是不同的.
DLL与.py文件位于不同的目录中(我只是没有写出所有路径设置的东西),可能是因为IronPython的解释器存在问题,因为它看起来不同,因为它是某种方式看到他们处于不同的背景或范围?
这在Visual Studio 2010 中的IronPython Interactive中失败:
» import random
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named random
Run Code Online (Sandbox Code Playgroud)
这在Visual Studio中的IronPython代码中也可以正常工作.如果我ipy.exe在Windows命令提示符下启动它也可以正常工作.IronPython Interactive和导入有什么问题?如何修复Python Interactive以便它可以导入Python模块?
IronPython Interactive中的sys.path给出了:
» import sys
» sys.path
['.',
'C:\\PROGRAM FILES (X86)\\MICROSOFT VISUAL STUDIO 10.0\\COMMON7\\IDE\\EXTENSIONS\\MICROSOFT\\IRONSTUDIO\\0.4\\Lib',
'C:\\PROGRAM FILES (X86)\\MICROSOFT VISUAL STUDIO 10.0\\COMMON7\\IDE\\EXTENSIONS\\MICROSOFT\\IRONSTUDIO\\0.4\\DLLs']
Run Code Online (Sandbox Code Playgroud)
Windows命令提示符下的ipy.exe中的sys.path给出:
>>> import sys
>>> sys.path
['.',
'C:\\Users\\MyName\\Desktop',
'C:\\Program Files (x86)\\IronPython 2.7\\Lib',
'C:\\Program Files (x86)\\IronPython 2.7\\DLLs',
'C:\\Program Files (x86)\\IronPython 2.7',
'C:\\Program Files (x86)\\IronPython 2.7\\lib\\site-packages']
Run Code Online (Sandbox Code Playgroud)
我使用的是IronPython 2.7,Visual Studio 2010和Windows …
有没有办法让一个类可用于IronPython脚本,以便我可以在代码中创建对象?
例如,如果我有一个类,我希望能够从C#代码中定义的名为MyClass的脚本中实例化,如下所示:
public class MyClass
{
string text;
public MyClass(string text)
{
this.text = text;
}
public void Write()
{
Console.WriteLine(text);
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能在Python脚本中这样做?
obj = MyClass("Hello, World!")
obj.Write()
Run Code Online (Sandbox Code Playgroud)
谢谢!
我想将PRAW包添加到VS中的IronPython解决方案中,但它确实是一个痛苦的屁股.这是我正在采取的步骤
然后我看到以下内容:
Installing 'pip' package manager.
Downloading distribute from https://go.microsoft.com/fwlink/?LinkID=306663
Installing from distribute-0.6.45
Before install bootstrap.
Scanning installed packages
Setuptools installation detected at c:\program files (x86)\ironpython 2.7\lib\site-packages\setuptools-0.6c11-py2.7.egg
Egg installation
Already patched.
running install
Traceback (most recent call last):
File "setup.py", line 147, in <module>
File "C:\Program Files (x86)\IronPython 2.7\Lib\distutils\core.py", line 151, in setup
File "C:\Program Files (x86)\IronPython 2.7\Lib\distutils\dist.py", line 952, in run_commands
File "C:\Program Files (x86)\IronPython 2.7\Lib\distutils\dist.py", line 971, in run_command
File "c:\users\mj\appdata\local\temp\ptvs-9jvsvw-pip_downloader\distribute-0.6.45\setuptools\command\install.py", line …Run Code Online (Sandbox Code Playgroud) 有人可以解释一下这个非常奇怪的观察吗?
我一直试图从IronPython内部调用Rx扩展方法,结果证明它根本不可能.我把它归结为这个简单的例子:
import clr
clr.AddReference("System.Core")
from System.Linq import Enumerable
def process(value):
return Enumerable.Select(value, lambda x:x)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们从正常的LINQ开始.如果我process使用数组或任何其他IEnumerable对象从我的托管环境调用该函数,它的工作完全正常.
那么我试着简单地替换引用以使用Observable扩展方法,如下所示:
import clr
clr.AddReference("System.Reactive.Linq")
from System.Reactive.Linq import Observable
def process(value):
return Observable.Select(value, lambda x:x)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果我process用一个IObservable对象调用该函数,则调用崩溃时会出现一条丑陋的错误消息:
expected IObservable[object], got Select[int, int]
有没有人遇到这样的事情?我错过了什么吗?是否有一些特殊情况黑客可以使缺少的Enumerablelambda代理工作Observable?我不得不承认我在这里完全不知所措.
顺便说一句,正如一个完整性检查,以下示例正常工作:
import clr
clr.AddReference("System.Reactive.Linq")
from System.Reactive.Linq import Observable
def process(value):
return Observable.Sum(value)
Run Code Online (Sandbox Code Playgroud)
我想把它留在那里只是为了清楚问题确实在方法调用中Observable.Select.