当我从Windows窗体应用程序中运行python脚本时,我希望启动一个Ironpython交互式窗口。我想将python IO重定向到交互式窗口。因此,脚本在运行时可以接受用户输入。
我已经以Windows窗体(C#)创建了一个应用程序,该应用程序托管了ironpython 2.7.9。我制作了一个简单的GUI,可让我使用OpenFileDialog()选择python脚本并使用引擎运行它。到目前为止,我的脚本不需要用户输入,并且从头到尾完全自动化。但是,现在我希望在这些脚本中包括手动步骤,这些步骤要求用户输入“ y”或“ n”以继续或中止脚本。随着winforms应用程序将所有输出打印到控制台,我无法在运行时与python脚本进行交互。理想情况下,当我运行脚本并能够从那里与python脚本进行交互时,我希望启动一个Ironpython交互式窗口。从我可以在线收集的内容来看,似乎我必须在我的计算机“程序文件”中硬编码到ipy.exe文件的路径,并以某种方式重定向python输入/输出,但这并不理想。我认为必须有一种更简单的方法来执行此操作,但无法弄清楚如何做。最终,我只是想向用户提供在C#中运行的python脚本的输入,因此,如果有任何其他方法可以满足此要求,我将接受这些想法。任何建议将不胜感激,如果需要更多信息,也请告知我!
我如何创建引擎:
public ScriptExecutor()
{
InitializeComponent();
myEngine = Python.CreateEngine();
}
private Microsoft.Scripting.Hosting.ScriptEngine myEngine;
我使用ExecuteFile函数运行脚本:
myEngine.ExecuteFile(@"path to file");
预期的结果是,当单击“运行脚本”按钮时启动python交互式窗口。用户可以在此交互式窗口中与脚本进行交互(输入/查看输出)
GUI图片:(https://imgur.com/RzzMI4N)
答案 0 :(得分:0)
经过大量实验,我找到了这个问题的答案。
我意识到我不应该使用引擎来寻找我想要的功能。相反,创建进程是启动ironPython窗口的最佳方法。 我看到的每个教程和问题都说要使用ProcessStartInfo.RedirectStandardOutput = true重定向输出
但是,如果您希望ipy控制台充当一个独立的进程,我们需要允许它接收输入和输出,因此这些值必须保持为false。 还必须将UseShellExecute和CreateNoWindow设置为false,以使操作系统外壳程序不会启动该过程,并启动一个新的ipy交互式窗口。
此外,由于ipy.exe已安装到System32文件夹中,因此我不需要对路径进行硬编码,而只需使用“ ipy.exe”
要启动python交互式窗口,我启动了一个过程:
var script = @"C:\path\to\script.py";
var psi = new ProcessStartInfo()
{
FileName = "ipy.exe",
Arguments = $"\"{script}\"",
UseShellExecute = false,
CreateNoWindow = false
};
Process python = new Process();
python.StartInfo = psi;