8

我已经用 Python.Net 玩了一个星期,但是我找不到任何示例代码来以嵌入式方式使用 Python.Net,尽管 Python.Net 源有几个嵌入式测试。我从以前的电子邮件列表 (Python.Net) 中搜索了许多线程,结果不一致且毫无头绪。

我正在尝试做的是在通过 Python.Net 从 python 提示符执行 python 命令(例如“print 2+3”)后从 C# 代码获取结果(PyObject po),因为 IronPython 与我目前的模块不兼容使用。

当我从 nPython.exe 执行它时,它会按预期打印出 5。但是,当我从 C# 以嵌入式方式运行此代码时。它总是返回'null'。你能给我一些想法,我怎样才能得到执行结果?

谢谢你,火花。

环境: 1. Windows 2008 R2,.Net 4.0。在 VS2012 2 中使用 Python27、UCS2 编译 Python.Net。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();
        }
    }
}
4

1 回答 1

8

似乎 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();
        }
    }
}
于 2013-04-05T18:26:19.260 回答