我一直在尝试使用交互式C#处理命令从不同的脚本中保存绘图(多个)。
目标:我的目标是通过在单个交互式python shell中执行多个脚本以及从C#中执行多个脚本来保存绘图。
这是我从头开始尝试过的代码。
代码段:
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')
从上面的C#代码中,您可以看到我已经尝试执行两个脚本。但是,在执行过程中,仅保存了第一个脚本(script1.py)的绘图,而第二个脚本(script2.py)却没有保存。
我所需要知道的是,为什么第二个脚本情节没有得到保存,其背后的原因是什么?
提前致谢 :)
最佳答案
由于您正在打开python shell,然后向其发送命令:
execfile('script1.py')
execfile('script2.py')
我一次又一次地怀疑我在加载
numpy
和matplotlib
所花费的时间内发送了第二个命令-您需要检查第一个execfile
的输出,以确保在发出第二个命令之前已完成的的发布,否则您需要为每个线程使用不同的线程-目前,您有一个线程尝试几乎同时执行两个单独的操作。请注意,完成python shell之后,通过发送
exit()
到进程stdin并调用process.WaitForExit()
退出它是非常好的好主意。还要注意,除了运行缓慢,依赖于安装了python的用户等以外,使用 shell 程序调用python代码并执行外部线程也被归类为安全漏洞,您最好还是考虑使用IronPython,但这是唯一的选择积极维护的我能够找到的绘图库是非免费的ILNumerics Visualization Engine。