2013-04-01 16 views
5

Tôi đã được chơi với Python.Net trong một tuần, nhưng tôi không thể tìm thấy bất kỳ mã mẫu nào để sử dụng Python.Net theo cách nhúng mặc dù nguồn Python.Net có một số thử nghiệm được nhúng. Tôi đã tìm kiếm nhiều chủ đề từ danh sách gửi email trước (Python.Net), kết quả không nhất quán và không có dấu vết.Bạn có chia sẻ ý tưởng của mình về cách gọi lệnh python từ Python.Net được nhúng không?

Điều tôi đang cố gắng làm là lấy kết quả (PyObject po) từ mã C# sau khi thực hiện lệnh python như 'print 2 + 3' từ dấu nhắc python qua Python.Net vì IronPython không có khả năng tương thích với mô-đun mà tôi hiện đang sử dụng.

Khi tôi thực thi nó từ nPython.exe, nó in ra 5 như tôi mong đợi. Tuy nhiên, khi tôi chạy mã này từ cách nhúng từ C#. nó trả về 'null' luôn. Bạn sẽ cho tôi một số suy nghĩ làm thế nào tôi có thể nhận được kết quả thực hiện?

Cảm ơn bạn, Spark.

Môi trường: 1. Windows 2008 R2, .Net 4.0. Biên soạn Python.Net với Python27, UCS2 tại VS2012 2. nPython.exe hoạt động tốt để chạy 'in 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(); 
     } 
    } 
} 

Trả lời

6

Nó có vẻ như PythonEngine.RunString() không hoạt động. Thay vào đó, PythonEngine.RunSimpleString() hoạt động tốt.

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

Trong khi chờ đợi, khi bạn chạy nó dưới dạng ứng dụng giao diện điều khiển, nó hoạt động tốt và hiển thị đầu ra chính xác, nhưng tôi không nhận được đầu ra khi tôi chạy bên dưới mã từ phương thức. Bất kỳ đề xuất để có được đầu ra bằng cách chuyển hướng? – spark

+1

Tôi nhận ra nó đã được một thời gian kể từ khi đăng bài của bạn, nhưng tôi đang tìm kiếm để làm điều tương tự và đã tự hỏi nếu bạn nhớ những gì bạn cuối cùng đã đi với. Ý tưởng là để chuyển hướng kết quả của các lệnh Python từ ứng dụng C# của tôi. – Spry