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 测试:

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

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目录 ,启动测试

4.样例源码 github
https://github.com/anseyuyin/c-sharpCallPythonExample
网友评论