C# Когда я открываю консоль, команда не вводится и она сразу исчезает - PullRequest
0 голосов
/ 30 января 2020
private void RunApp_Click(object sender, RoutedEventArgs e)
    {
        RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Python\PythonCore\3.7\InstallPath");
        if (key != null)
        {
            object path = key.GetValue("ExecutablePath");
            string comm = "/C " + System.IO.Path.GetDirectoryName(path as string) + @"\python " + 
                System.IO.Path.GetDirectoryName((string)SelectProjectFolder.Content) + "main.py";
            System.Diagnostics.Process.Start("cmd.exe", comm);
        }
    }

Где ошибка? Консоль открывается без команды и сразу закрывается. Что делать с этипом. Мне нужно запустить .py файл через консоль. Я получаю путь к Python через ключ и добавляю путь к файлу Py. Но когда вы открываете команду в консоли, нет. (Переводчик Google)

Ответы [ 2 ]

1 голос
/ 30 января 2020

Вы передаете "/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}");
}
0 голосов
/ 30 января 2020

Вы можете использовать ProcessStartInfo:

string path = @"C:\Program Files\Python";
string args = "main.py";
ProcessStartInfo pinfo = new ProcessStartInfo(path);
pinfo.Arguments = args;
using(Process proc = Process.Start(pinfo))
{
    proc.WaitForExit();
    if(proc.ExitCode == 0)
    {
        // Normal exit
    }
    else
    {
        // Exit with error
    }
}

ProcessStartInfo можно использовать, если в вашем коде есть ссылка на System.Diagnostics.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...