2013-04-01 44 views
5

私はPython.Netで一週間プレイしてきましたが、Python.Netソースにはいくつかの埋め込みテストがありますが、埋め込み式でPython.Netを使用するサンプルコードは見つかりません。私は以前の電子メールリスト(Python.Net)から多くのスレッドを検索しましたが、結果は一貫性がなく、無知です。埋め込みPython.Netからpythonコマンドを呼び出す方法をご存知ですか?

私がしようとしているのは、Python.Net経由でPythonプロンプトから 'print 2 + 3'のようなpythonコマンドを実行した後で、C#コードから結果(PyObject po)を取得することです。私が現在使っているモジュール。

私はnPython.exeから実行したとき、期待通りに5を出力します。しかし、私はC#から埋め込まれた方法でこのコードを実行します。常に 'null'を返します。実行結果をどのように得ることができるか考えてください。

ありがとう、 スパーク。

環境: 1. Windows 2008 R2、.Net 4.0。 VS2012 でPython27、UCS2とPython.Net 2. nPython.exe 'プリント2 + 3' を実行するために正常に動作します

using NUnit.Framework; 
using Python.Runtime; 

namespace CommonTest 
{ 
    [TestFixture] 
    public class PythonTests 
    { 
     public PythonTests() 
     { 

     } 
     [Test] 
     public void CommonPythonTests() 
     { 

      PythonEngine.Initialize(); 

      IntPtr gs = PythonEngine.AcquireLock(); 
      PyObject po = PythonEngine.RunString("print 2+3"); 
      PythonEngine.ReleaseLock(gs); 

      PythonEngine.Shutdown(); 
     } 
    } 
} 

答えて

6

コンパイルされたそれはPythonEngine.RunString(ように思える)は動作しません。代わりに、PythonEngine.RunSimpleString()は正常に動作します。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Diagnostics; 
using System.Reflection; 
using Python.Runtime; 

namespace npythontest 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      string external_file = "c:\\\\temp\\\\a.py"; 

      Console.WriteLine("Hello World!"); 
      PythonEngine.Initialize(); 

      IntPtr pythonLock = PythonEngine.AcquireLock(); 

      var mod = Python.Runtime.PythonEngine.ImportModule("os.path"); 
      var ret = mod.InvokeMethod("join", new Python.Runtime.PyString("my"), new Python.Runtime.PyString("path")); 
      Console.WriteLine(mod); 
      Console.WriteLine(ret); 
      PythonEngine.RunSimpleString("import os.path\n"); 
      PythonEngine.RunSimpleString("p = os.path.join(\"other\",\"path\")\n"); 
      PythonEngine.RunSimpleString("print p\n"); 
      PythonEngine.RunSimpleString("print 3+2"); 
      PythonEngine.RunSimpleString("execfile('" + external_file + "')"); 

      PythonEngine.ReleaseLock(pythonLock); 
      PythonEngine.Shutdown(); 
     } 
    } 
} 
+3

一方、コンソールアプリケーションとして実行すると、正しく動作し、出力が正しく表示されますが、以下のコードをメソッドから実行すると出力されません。リダイレクトによって出力を得るための提案はありますか? – spark

+1

私はあなたのポストからそれがしばらくしていたことを認識していますが、私は同じことをするために探していて、あなたが最終的に行ったことを覚えているのだろうかと思っていました。このアイデアは、Pythonコマンドの結果をC#アプリケーションからリダイレクトすることです。 – Spry

関連する問題