美文网首页
C# 调用python脚本 编写 窗体程序

C# 调用python脚本 编写 窗体程序

作者: ansey | 来源:发表于2019-08-23 22:23 被阅读0次

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

4.样例源码 github
https://github.com/anseyuyin/c-sharpCallPythonExample

相关文章

网友评论

      本文标题:C# 调用python脚本 编写 窗体程序

      本文链接:https://www.haomeiwen.com/subject/cmdasctx.html