2013-04-01 4 views
5

Sono stato giocato con Python.Net per una settimana, ma non riesco a trovare alcun codice di esempio per usare Python.Net in modo integrato sebbene l'origine di Python.Net abbia diversi test di embedding. Ho cercato molti thread dalla mailing list precedente (Python.Net), i risultati non sono coerenti e sono senza tracce.Vuoi condividere la tua idea di chiamare il comando python da Python.Net incorporato?

Quello che sto cercando di fare è ottenere il risultato (PyObject po) dal codice C# dopo aver eseguito il comando python come 'print 2 + 3' dal prompt python tramite Python.Net perché IronPython non ha compatibilità con modulo che sto usando attualmente.

Quando l'ho eseguito da nPython.exe, stampa 5 come mi aspettavo. Tuttavia, quando eseguo questo codice da modo incorporato da C#. restituisce 'null' sempre. Mi daresti qualche pensiero su come posso ottenere il risultato dell'esecuzione?

Grazie, Spark.

Enviroments: 1. Windows 2008 R2, .Net 4.0. Python.Net Compilato con Python27, UCS2 a VS2012 2. nPython.exe funziona bene per eseguire 'print 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(); 
     } 
    } 
} 

risposta

6

sembra PythonEngine.RunString() non funziona. Invece, PythonEngine.RunSimpleString() funziona bene.

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

Nel frattempo, quando lo si esegue come un'applicazione di console, funziona correttamente e visualizza l'output correttamente, ma non viene visualizzato quando corro sotto il codice di un metodo. Qualche suggerimento per ottenere l'output tramite reindirizzamento? – spark

+1

Mi rendo conto che è passato un po 'di tempo dal tuo post, ma sto cercando di fare la stessa cosa e mi stavo chiedendo se ti ricordi che fine hai fatto. L'idea è di reindirizzare il risultato dei comandi Python dalla mia applicazione C#. – Spry