2014-06-27 134 views
0

我正在寫一個C#組件,它以Ironpython函數作爲參數。在C#中捕獲Python打印語句

def test(): 
     x=x+1 
     print "Test" 

C#:

var v = engine.Operations.Invoke(scope.GetVariable("test")); 

瓦爾v回報nullprint語句。它只適用於我有return(x)。我可以使用ironpython捕獲打印語句嗎?

評論和鏈接表示讚賞。另外,可以使用命令行捕獲它?

+1

的[?我怎樣才能重定向IronPython的在C#標準輸出(可能重複http://stackoverflow.com/questions/3055002/how-can-i-redirect-the-stdout-of-ironpython-in-c) –

+0

如果我有「sys.stdout」,上面的鏈接可以工作。我的腳本只有打印命令? – user2801184

+0

默認情況下,print語句使用'sys.stdout'。 (也參見http://stackoverflow.com/a/3263763/539465) –

回答

2

這個工作對我來說:

var script = @"import sys 
def test(): 
    print sys.version 
    print >> sys.stderr, 'this goes to stderr' 
    return 42"; 

var scriptEngine = Python.CreateEngine(); 
var scriptScope = scriptEngine.CreateScope(); 
scriptEngine.Execute(script, scriptScope); 
var testFn = scriptScope.GetVariable("test"); 
var streamOut = new MemoryStream(); 
var streamErr = new MemoryStream(); 
scriptEngine.Runtime.IO.SetOutput(streamOut, Encoding.Default); 
scriptEngine.Runtime.IO.SetErrorOutput(streamErr, Encoding.Default); 
scriptEngine.Operations.Invoke(testFn); 
Console.WriteLine("returned: {0}", scriptEngine.Operations.Invoke(testFn)); 
Console.WriteLine("captured out:\n{0}", Encoding.Default.GetString(streamOut.ToArray())); 
Console.WriteLine("captured err:\n{0}", Encoding.Default.GetString(streamErr.ToArray())); 

輸出:

returned: 42 
captured out: 
2.7.5b2 (IronPython 2.7.5b2 (2.7.5.0) on .NET 2.0.50727.5477 (64-bit)) 

captured err: 
this goes to stderr 
+0

你很多帕維爾。我真的很感謝你的幫助,但是如果可能的話,請你回答我上面的問題,也可以在解決方案的說明上面回答。你也可以給我鏈接。急切地等待迴應! – user2801184

+0

我很困惑。你能否重申你想回答的問題? –

+0

你能回答兩個嗎?我不知道:如果使用方法1,那麼我們如何獲得返回值,因爲它處於不同的類別中。並使用流我們能夠捕獲輸出? – user2801184