Как сохранить графики из нескольких сценариев python с помощью интерактивной команды процесса С#?

Я пытаюсь сохранить графики (несколько) из разных сценариев с помощью интерактивной команды процесса С#.

Цель: Моя цель - сохранить графики, выполнив несколько сценариев в одной интерактивной оболочке python, а также с С#.

Вот код, который я пробовал с моего конца.

Фрагмент кода:

class Program
{
    static string data = string.Empty;
    static void Main(string[] args)
    {
        Process pythonProcess = new Process();
        ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe", "/c" + "python.exe -i");
        startInfo.WorkingDirectory = "C:\\python";
        startInfo.CreateNoWindow = true;
        startInfo.UseShellExecute = false;
        startInfo.RedirectStandardInput = true;
        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardError = true;
        pythonProcess.StartInfo = startInfo;
        pythonProcess.ErrorDataReceived += Process_ErrorDataReceived;
        pythonProcess.OutputDataReceived += Process_OutputDataReceived;
        pythonProcess.Start();
        pythonProcess.BeginErrorReadLine();
        pythonProcess.BeginOutputReadLine();
        Thread.Sleep(5000);

        while (data != string.Empty)
        {
            if (data == "Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.")
            {
                pythonProcess.StandardInput.WriteLine("execfile('script1.py')");
                pythonProcess.StandardInput.WriteLine("execfile('script2.py')");
                break;
            }
        }
        pythonProcess.WaitForExit();
    }

    private static void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        data = e.Data;
    }

    private static void Process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
    {
        data = e.Data;
    }
}

Сценарии:

script1.py

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 5, 0.1);
y = np.sin(x)
plt.plot(x, y)
plt.savefig('script1.png')

script2.py

import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.savefig('script2.png')

Из приведенного выше кода на С# вы можете увидеть, что я попытался выполнить оба сценария. Но во время выполнения заглавная страница с первого script (script1.py) сохраняется, а вторая (script2.py) - нет.

Все, что мне нужно знать, это то, почему второй сюжет script не сохраняется и какова причина этого?

Заранее спасибо:)

Ответ 1

Поскольку вы открываете оболочку python и затем отправляете ему команды:

execfile('script1.py')
execfile('script2.py')

Сразу же один за другим я подозреваю, что вторая команда отправляется во время загрузки numpy и matplotlib - вам нужно проверить вывод из первого execfile, чтобы убедиться, что он имеет завершено, прежде чем выпустить второй, или вам нужно использовать другой поток для каждого - на данный момент у вас есть один поток, пытающийся выполнить два отдельных действия почти сразу.

Обратите внимание, что после того, как вы закончите с вашей оболочкой python, это хорошая идея very выйти из нее, отправив exit() в процесс stdin и вызывая process.WaitForExit().

Также обратите внимание, что использование оболочки для вызова кода python и выполнения внешних потоков классифицируется как уязвимость безопасности в дополнение к медленному, зависит от пользователя, имеющего установленный python, и т.д., вам может быть лучше смотреть на использование IronPython - но единственной активно поддерживаемой графической библиотекой, которую I смог найти, является несвободный Механизм визуализации ILNumerics.