1.前因

前一阵有需求, 基于一个 python库 来 封装一个窗体应用程序,因为需求简单,所以仅需要用到字符输入和字符打印输出的交互即可,同时还需要import第三方库,所以没有使用 IronPython 方案, 而是直接使用 C#调用挂起 .py 脚本 ,通过 Process 实例 输入字符指令 ,然后接受 输入打印字符串的方式来实现.

2.环境

Visual Studio 2015

python 3.7.4

以下是简单的实现过程以供参考

3.实现

3.1.写一个死循环 脚本main.py ,让程序不会退出 且重复接受指令打印输出信息

def commandParse(str):
if str == 'a':
print('输入a')
elif str == 'b':
print('输出b')

else:

print('指令错误 : ',str)
while True:
command = input()
commandParse(command)

main.py 测试:


脚本测试.png

3.2.新建 C# 窗体应用程序 , 搭建一个简单的界面


简单界面.png

3.3.实例化一个python进程 调用 main.py 脚本

string fileName = "main.py";
Process pythonP;
void runPythonP()
{
pythonP = new Process();

string scriptPath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + fileName;// 获得python文件的绝对路径(为了方便我将文件放在c#的debug文件夹中)

pythonP.StartInfo.FileName = "python";//没有配环境变量的话,可以写"xx\xx\python.exe"的绝对路径。如果配了,直接写"python"即可

pythonP.StartInfo.Arguments = scriptPath;
pythonP.StartInfo.UseShellExecute = false;
pythonP.StartInfo.RedirectStandardOutput = true;
pythonP.StartInfo.RedirectStandardInput = true;
pythonP.StartInfo.RedirectStandardError = true;
//后台模式设置
pythonP.StartInfo.CreateNoWindow = true;
pythonP.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
//启动进程
pythonP.Start();
pythonP.BeginOutputReadLine();
pythonP.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); //注册输出接收事件函数
Console.ReadLine();
}

3.4.输出接收事件函数

void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
var printedStr = e.Data;
Action at = new Action(delegate ()
{
//接受main.py 进程打印的字符信息到文本显示框
richTextBox1.AppendText(printedStr + "\n");
});
Invoke(at);
}

3.5.输入到python进程

pythonP.StandardInput.WriteLine(textBox2.Text);//按钮点击时发送 输入框的指令给 main.py 进程

3.6.main.py 文件放入Debug目录 ,启动测试


最后测试.png