gpt4 book ai didi

c# - 如何使用交互式 C# 进程命令从多个 python 脚本保存绘图?

转载 作者:太空狗 更新时间:2023-10-29 17:51:23 25 4
gpt4 key购买 nike

我一直在尝试使用交互式 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')

我怀疑第二个命令是在加载 numpymatplotlib 期间发送的,您需要检查第一个 execfile 的输出以确保它已完成在发出第二个之前,或者您需要为每个使用不同的线程 - 目前您有一个线程几乎同时尝试执行两个单独的操作。

请注意,一旦您完成了 python shell,通过将 exit() 发送到进程标准输入并调用 process.WaitForExit() 来退出它是一个非常的好主意。

另请注意,使用 shell 调用 python 代码和执行外部线程除了速度慢、依赖于安装了 python 的用户等之外,还被归类为安全漏洞,您最好还是使用 IronPython -但 能够找到的唯一积极维护的绘图库是非免费 ILNumerics Visualization Engine

关于c# - 如何使用交互式 C# 进程命令从多个 python 脚本保存绘图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39405252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com