你能分享一下如何从嵌入式Python.Net中调用Python命令的想法吗?(注意:这是一个提问标题,无需回答)

8
我已经使用Python.Net一周了,但是我无法找到任何示例代码来以嵌入方式使用Python.Net,尽管Python.Net源代码中有几个嵌入测试。我从之前的邮件列表(Python.Net)中搜索了很多线程,结果不一致且无头绪。
我的目标是在C#代码中执行python命令(例如'print 2+3')后获得结果(PyObject po),因为IronPython与我当前使用的模块不兼容。
当我从nPython.exe中执行它时,它按预期输出5。然而,当我从C#的嵌入方式运行此代码时,它总是返回“null”。你能给我一些想法,如何获取执行结果吗?
谢谢, Spark。
环境: 1. Windows 2008 R2,.Net 4.0。在VS2012中使用Python27,UCS2编译Python.Net 2. nPython.exe可以成功运行“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();
        }
    }
}
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();
        }
    }
}

3
同时,当您将其作为控制台应用程序运行时,它能够正常运行并正确显示输出,但是当我从一个方法中运行下面的代码时,无法获得输出。有没有什么建议可以通过重定向方式获取输出? - spark
1
我知道你的帖子已经有一段时间了,但我也想做同样的事情,不知道你最终选择了什么。我的想法是从我的C#应用程序中重定向Python命令的结果。 - Spry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接