c#与python联合编程二

方法二:查找资料后,发现还有一种方法
即使用安装好的python环境,利用c#命令行,调用.py文件执行
优点:执行速度只比在python本身环境中慢一点,步骤也相对简单。
缺点:需要用户安装配置python环境
下面展示代码`。

#multi.py
 
def multiplication(a,b):
	return a*b
import numpy as n p
import multi
import sys

def func(a,b):
    result=np.sqrt(multi.multiplication(int(a),int(b)))
    return result
 
 
if __name__ == '__main__':
    print(func(sys.argv[1],sys.argv[2]))

//c#代码如下
private void button1_Click(object sender, EventArgs e)
{
            string[] strArr = new string[2];//参数列表
            string sArguments = @"main.py";//这里是python的文件名字
            strArr[0] = "5";
            strArr[1] = "5";
            RunPythonScript(sArguments, "-u", strArr);
 }
public static void RunPythonScript(string sArgName, string args = "", params string[] teps)
 {   //实例一个Process类,启动一个独立进程
            Process p = new Process();
            string path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + sArgName;// 获得python文件的绝对路径(将文件放在c#的debug文件夹中可以这样操作)
            path = "C:\\Users\\82357\\Desktop\\SHENDU\\python_exe\\ironpython_exe\\ironpython_exe\\bin\\Debug\\" + sArgName;//(因为我没放debug下,所以直接写的绝对路径,替换掉上面的路径了)

            //Process类有一个StartInfo属性,这个是ProcessStartInfo类,包括了一些属性和方法,下面我们用到了他的几个属性:

            //p.StartInfo.FileName设定程序名
            p.StartInfo.FileName = @"C:\\Users\\82357\\Anaconda3\\python.exe";//没有配环境变量的话,可以像我这样写python.exe的绝对路径。如果配了,直接写"python.exe"即可
            string sArguments = path;
            foreach (string sigstr in teps)
            {
                sArguments += " " + sigstr;//传递参数
            }

            sArguments += " " + args;
            // p.StartInfo.Arguments设定程序执行参数
            p.StartInfo.Arguments = sArguments;
            //p.StartInfo.UseShellExecute开关Shell的使用
            p.StartInfo.UseShellExecute = false;
            //p.StartInfo.RedirectStandardOutput重新定向标准输出
            p.StartInfo.RedirectStandardOutput = true;
            //p.StartInfo.RedirectStandardInput重新定向标准输入
            p.StartInfo.RedirectStandardInput = true;
            //p.StartInfo.RedirectStandardError重新定向错误输出
            p.StartInfo.RedirectStandardError = true;
            // p.StartInfo.CreateNoWindow设置不显示窗口
            p.StartInfo.CreateNoWindow = true;

            //p.StandardInput.WriteLine(command);       //也可以用这种方式出入要执行的命令
            //p.StandardInput.WriteLine("exit");        //不过要记得加上Exit要不然下一行程序执行的时候要当机
         
            p.Start();
            p.BeginOutputReadLine();
            p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
            Console.ReadLine();
            p.WaitForExit();
 }
//输出打印的信息
static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
 {
            if (!string.IsNullOrEmpty(e.Data))
            {
                AppendText(e.Data + Environment.NewLine);
            }
 }
public delegate void AppendTextCallback(string text);
public static void AppendText(string text)
 {
            MessageBox.Show(text);
            //此处在控制台输出.py文件print的结果
            //Console.WriteLine(text);
 }*/

该方法我发现使用简单,即通过调用python.exe运行py文件。例子设置了返回string参数于是想把代码写简单一点调用看看:

if __name__ == '__main__':
#    img = cv2.imread(r'C:/Users/82357/Desktop/SHENDU/deep_dll/deep_dll/x64/Release/pic_temp/now.jpg')
    img = cv2.imread( sys.argv[1])
#load_image()是自己定义的一个深度学习模型处理函数
    load_image(img)
    cv2.waitKey(0)
 #   print("调用成功")

 private void button4_Click(object sender, EventArgs e)
        {
            string strArr = filename;
            string sArguments = @"zzz.py";
            RunPythonScript(sArguments, strArr);
        }
        public static void RunPythonScript(string sArgName,  params string[] teps)
        {
            Process p = new Process();
            string path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + sArgName;// 获得python文件的绝对路径(将文件放在c#的debug文件夹中可以这样操作)
            path = "C:\\Users\\82357\\Desktop\\SHENDU\\deep_dll\\deep_dll\\x64\\Release\\" + sArgName;//(因为我没放debug下,所以直接写的绝对路径,替换掉上面的路径了)

            //p.StartInfo.FileName设定程序名
            p.StartInfo.FileName = @"C:\\Users\\82357\\Anaconda3\\python.exe";//没有配环境变量的话,可以像我这样写python.exe的绝对路径。如果配了,直接写"python.exe"即可
            string sArguments = path;
         
            foreach (string sigstr in teps)
            {
                sArguments += " " + sigstr;//传递参数
            }

     //       sArguments += " " + args;

            p.StartInfo.Arguments = sArguments;

            p.StartInfo.UseShellExecute = false;

            p.StartInfo.RedirectStandardOutput = true;

            p.StartInfo.RedirectStandardInput = true;

            p.StartInfo.RedirectStandardError = true;

            p.StartInfo.CreateNoWindow = true;

            p.Start();//启动
           
        }

这里只做到传递一个string类型参数进去,然后运行py文件,py文件中包含深度学习模型和opencv库,能够调用成功。

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值