Как выполнить и вернуть результаты сценария 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, упомянутые в комментариях, могут не работать для меня здесь.
Хорошо, я понял, в чем проблема, благодаря некоторым выводам из комментариев. В основном это были пробелы на пути к 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.
webclient
- myadventuresincoding.wordpress.com/2011/01/02/… - игнорируйте слово mongodb, оно не имеет к этому никакого отношения, просто посмотрите на остальные части API.