Как мне выполнить и вернуть результаты скрипта Python в C #?

1

Как выполнить и вернуть результаты сценария python в С#?

Я пытаюсь запустить скрипт python с моего контроллера.

У меня есть установка python.exe в папке виртуальной среды, созданной с помощью команды virtualenv.

Так что для тестирования на данный момент я хотел бы просто вернуть результирующую строку из моего скрипта phython:

# myscript.py
print "test"

И отобразите это в представлении моего приложения asp.net mvc.

Я получил функцию run_cmd из связанного с этим qaru.site/questions/74935/.... Я попытался добавить параметр -i, чтобы принудительно активировать интерактивный режим и вызывать process.WaitForExit() без везения.

namespace NpApp.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index(string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;

            ViewBag.textResult = run_cmd("-i C:/path/to/virtualenv/myscript.py", "Some Input");

            return View();
        }

        private string run_cmd(string cmd, string args)
        {
            ProcessStartInfo start = new ProcessStartInfo();
            start.FileName = @"C:/path/to/virtualenv/Scripts/python.exe";
            start.CreateNoWindow = true;
            start.Arguments = string.Format("{0} {1}", cmd, args);
            start.UseShellExecute = false;
            start.RedirectStandardOutput = true;
            using (Process process = Process.Start(start))
            {
                using (StreamReader reader = process.StandardOutput)
                {
                    string result = reader.ReadToEnd();
                    //Console.Write(result);
                    process.WaitForExit();
                    return result;
                }
            }
        }
    }
}

Кажется, что myscript.py даже не запускается. Но у меня нет ошибок, просто пустая переменная на мой взгляд.

Редактировать:

Я попытался упростить вышеупомянутые вещи, потому что я думал, что будет легче объяснить и получить ответ. В конце концов мне нужно использовать пакет под названием "nameparser" и сохранить результат переданного аргумента имени в базу данных. Но если я могу просто получить run_cmd, чтобы вернуть строку, я думаю, что я позабочусь обо всем остальном. Вот почему я думаю, что остальные api и IronPython, упомянутые в комментариях, могут не работать для меня здесь.

  • 0
    Вы можете разместить Python как REST API и вызвать его с помощью webclient - myadventuresincoding.wordpress.com/2011/01/02/… - игнорируйте слово mongodb, оно не имеет к этому никакого отношения, просто посмотрите на остальные части API.
  • 0
    Попробуйте IronPython: codeproject.com/Articles/15579/Call-Ironpython-in-C Он разработан для .NET.
Показать ещё 5 комментариев
Теги:
python-2.7

1 ответ

0
Лучший ответ

Хорошо, я понял, в чем проблема, благодаря некоторым выводам из комментариев. В основном это были пробелы на пути к python.exe и myscript.py. Оказывается, мне не нужно -i или process.WaitForExit(). Я просто переместил виртуальную среду python в путь без пробелов, и все начало работать. Также убедитесь, что файл myscript.py является исполняемым.

Это было действительно полезно:

string stderr = process.StandardError.ReadToEnd();
string stdout = process.StandardOutput.ReadToEnd();
Debug.WriteLine("STDERR: " + stderr);
Debug.WriteLine("STDOUT: " + stdout);

Это показывает ошибки и вывод python на панели "Вывод" в Visual Studio.

  • 0
    да чтение standarError приводит к проблеме

Ещё вопросы

Сообщество Overcoder
Наверх
Меню