Как сохранить графики из нескольких сценариев 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.