Вы передаете "/C"
в командное окно, что означает «Выполняет команду, указанную в строке, а затем завершается» (введите cmd.exe /?
в командной строке, чтобы увидеть все аргументы, которые она принимает, вместе с описанием каждого).
Вместо этого попробуйте передать "/K"
, если вы хотите, чтобы окно оставалось:
string comm = "/K " + …
Тогда вы сможете увидеть, что это за ошибка сообщается (если есть).
Скорее всего, вам не хватает символа backsla sh ('\'
) между SelectProjectFolder.Content
и "main.py"
. Чтобы решить эту проблему, обычно рекомендуется использовать Path.Combine
для создания путей к каталогам:
Path.Combine(Path.GetDirectoryName((string)SelectProjectFolder.Content)), "main.py")
Еще одна вещь, которую вы можете сделать, это попробовать различные ключи реестра, если проблема в том, что путь к python .exe не найден. Я думаю это правильно, но они должны быть проверены:
private string GetPythonExePath(string ver = "3.7")
{
return (Registry.LocalMachine
.OpenSubKey($@"SOFTWARE\Python\PythonCore\{ver}\InstallPath")?
.GetValue("ExecutablePath") ??
Registry.CurrentUser
.OpenSubKey($@"Software\Python\PythonCore\{ver}\InstallPath")?
.GetValue("ExecutablePath") ??
Registry.LocalMachine
.OpenSubKey($@"SOFTWARE\Wow6432Node\Python\PythonCore\{ver}\InstallPath")?
.GetValue("ExecutablePath"))?
.ToString();
}
Кроме того, вы можете установить путь к файлу python отдельно от команды Process.Start
, чтобы сделать отладка немного проще (вы можете установить точку останова в строке Process.Start
и проверить аргументы перед запуском процесса):
var pythonExePath = GetPythonExePath();
if (pythonExePath!=null)
{
var pythonFile = Path.Combine(SelectProjectFolder.Content.ToString(), "main.py");
Process.Start("cmd.exe", $"/K {pythonExePath} {pythonFile}");
}