Не могли бы вы поделиться своей идеей, как вызвать команду python из встроенного Python.Net?

Я играл с Python.Net в течение недели, но я не могу найти ни одного примера кода для использования Python.Net во встроенном виде, хотя в исходном коде Python.Net есть несколько встроенных тестов. Я просмотрел множество тем из предыдущего списка рассылки (Python.Net), результаты не согласованы и невежественны.

Что я пытаюсь сделать, так это получить результат (PyObject po) из кода С# после выполнения команды python, такой как «print 2 + 3», из приглашения python через Python.Net, потому что IronPython не совместим с модулем, который я сейчас с использованием.

Когда я выполнил его из nPython.exe, он вывел 5, как я и ожидал. Однако, когда я запускаю этот код из встроенного способа из С#. он всегда возвращает 'null'. Не могли бы вы дать мне несколько мыслей, как я могу получить результат выполнения?

Спасибо, Спарк.

Среды: 1. Windows 2008 R2, .Net 4.0. Скомпилирован Python.Net с Python27, UCS2 на VS2012 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();
        }
    }
}

person spark    schedule 01.04.2013    source источник


Ответы (1)


Похоже, 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();
        }
    }
}
person spark    schedule 05.04.2013
comment
Между тем, когда вы запускаете его как консольное приложение, оно работает нормально и правильно отображает вывод, но я не получаю вывод, когда запускаю приведенный ниже код из метода. Любые предложения, чтобы получить вывод путем перенаправления? - person spark; 05.04.2013
comment
Я понимаю, что прошло много времени с момента вашего поста, но я хочу сделать то же самое, и мне было интересно, помните ли вы, с чем вы в конечном итоге пошли. Идея состоит в том, чтобы перенаправить результат команд Python из моего приложения C#. - person Spry; 12.05.2016