一 、C#调用Python的使用总结

  由于项目的需要,需要通过C#调用Python文件(算法)。之前接触不多,在测试试验的过程遇到了挺多坑的,在这里将试验的过程和结果在这里总结一下。

一.使用IronPython作为移植的依赖库,直接调用python文件的函数接口。

  百度词条:IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,由 Jim Hugunin(同时也是 Jython 创造者)所创造。它的诞生是为了将更多的动态语音移植到NET Framework上。

  通过简单的C#代码实现对python文件内部函数的调用。这种方法可以说是最简单直接的,但是,问题来了。IronPython的发布截止到2011年3月,就是说后面就没有进行开发和更新了。Python的设计应用日新月异,相关的库的设计和开发层出不穷。不能支持很多第三方库的引用和加载是这种方法最大的缺陷,简单的代码我们也没必要专门写成python文件去给C#调用,C#自己都可以写。

  这种方法建议大伙就别尝试了,浪费时间。

PS:(更正,IronPython还是有继续更新发布的,最新版本是 2.7.10,发布于April 27, 2020。可以到网页进行了解https://ironpython.net/,谢谢三楼纠正)

二.使用c++程序调用python文件,然后将其做成动态链接库(dll),在c#中调用此dll文件。

  这种方法是最开始使用的,但由于运行速度太慢,所以排除使用,所以后续才有第三种方法。详细如何操作,这里没研究过就不介绍了(别人开发接口的dll,直接使用没去了解具体操作)。

三.需要安装python安装包和库环境,利用c#命令行,调用.py文件执行(最终使用方法)

  这种方法:通过C#命令行调用.py文件 == 通过python.exe 打开.py文件

  他的适用性强,你只要保证你的.py程序能够通过python.exe打开,使用就不会有大问题,同时还有一些需要注意的点。

  (1)文件路径不能使用相对路径(例:path = ./文件名 或者path = 文件名 ),会报错,这一块我不清楚是否别人没遇到,反正我的话是一直会报这种错误。

  解决方法也很简单,要么用绝对路径,要么导入os库,通过os.path.dirname(__file__)可以得到当前文件的路径,即path = os.path.dirname(__file__) + '\文件名'

  (2)路径间隔需要用/代替\;同时“\\”作为输入参数偶尔也会有出现异常的情况,原因不明。个人建议将输入路径参数全部提前替换

  (3)不能调用py文件的接口,函数方法

  (4)最好在程序前附加异常检测处理(try,exception),便于获取异常(C#调用Python偶尔库,或者一些路径会有异常,导致直接运行失败)

if __name__=='__main__':    try:        #代码行        a = 1    except Exception as err:        #捕捉异常        str1 = 'default:' + str(err)    else:        # 代码运行正常        str1 = "Code are operating normally."    print(str1)

  测试步骤如下:

  1、下载安装python,安装环境库

  我是通过Notepad++进行python程序编写,安装库直接使用python自带pip进行安装。通过CMD直接进行安装

  (1)下面介绍几个常用的pip操作和如何安装库

    显示pip的安装列表:pip list
    安装库:pip install 库名
    安装对应版本的库:pip install --upgrade 库名==版本号
    卸载库:pip uninstall 库名

  (2)等待安装完毕即可

  (3)注意网速问题,如果网速不好建议直接下载对应库的离线安装包(注意)

  2、通过VS编写一个简单的window窗口进行测试,C#界面和代码如下

  有一些需要注意的地方,首先:文件路径不能存在空格;输入参数是路径的建议全部替换'\\'为'/';

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Diagnostics;using System.Drawing;using System.IO;using System.Linq;using System.Text;using System.Windows.Forms;namespace ToolApp{    public partial class Example : Form    {        private Process progressTest;        public Example()        {            InitializeComponent();        }        private void buttonAdd_Click(object sender, EventArgs e)        {            try            {                string path = Application.StartupPath + @"\Add.py";//py文件路径                int a = Convert.ToInt32(this.textBox1.Text);                int b = Convert.ToInt32(this.textBox2.Text);                StartTest(path, a, b);            }            catch(Exception e1)            {                MessageBox.Show(e1.Message);            }        }        /// <summary>        /// 开始测试        /// </summary>        /// <param name="pathAlg">py文件路径</param>        /// <param name="a">加数a</param>        /// <param name="b">加数b</param>        /// <returns></returns>        public bool StartTest(string pathAlg, int a, int b)        {            bool state = true;            if (!File.Exists(pathAlg))            {                throw new Exception("The file was not found.");                return false;            }            string sArguments = pathAlg;            sArguments += " " + a.ToString() + " " + b.ToString() + " -u";//Python文件的路径用“/”划分比较常见            ProcessStartInfo start = new ProcessStartInfo();            start.FileName = @"python.exe";//环境路径需要配置好            start.Arguments = sArguments;            start.UseShellExecute = false;            start.RedirectStandardOutput = true;            start.RedirectStandardInput = true;            start.RedirectStandardError = true;            start.CreateNoWindow = true;            using (progressTest = Process.Start(start))            {                // 异步获取命令行内容                progressTest.BeginOutputReadLine();                // 为异步获取订阅事件                progressTest.OutputDataReceived += new DataReceivedEventHandler(outputDataReceived);            }            return state;        }        public void outputDataReceived(object sender, DataReceivedEventArgs e)        {            if (!string.IsNullOrEmpty(e.Data))            {                this.Invoke(new Action(() => {                    this.textBox3.Text = e.Data;                }));            }        }    }}

  3、通过Notepad++编写一个简单的加法函数,调用Python文件代码如下,导入栏导入一些比较第三方的库(为了测试看看第三方库的导入是否正常)

import numpyimport osimport sysdef Add(a,b):    return a+bif __name__=='__main__':    try:        #代码行        a = int(sys.argv[1])        b = int(sys.argv[2])        c = Add(a,b)    except Exception as err:        #捕捉异常        str1 = 'default:' + str(err)    else:        # 代码运行正常        str1 = c    print(str1)

  4、生成成功,通过界面输入两组数字,点击测试,可以成功得到结果,效果如下

———————————————————————————————————————————

如何使用IronPython,参考链接:https://www.cnblogs.com/ligiggy/p/11471071.html

四种方法调用,参考链接:https://blog.csdn.net/qq_42063091/article/details/82418630

(0)

相关推荐

  • 在Win10系统中Vscode搭建Python3开发环境

    前言 Python是一种跨平台的计算机程序设计语言,是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python 是商业数据分析.人工智能领域必不可少的工具,应用领域极其广泛,囊括了网 ...

  • pip,pip3,python2,python3,python -m 之间的区别

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/pip,pip3,python2,python3,python -m 之间的区别 作者:融水公子 rsgz Python3 教程 python教程 ...

  • python下面lib和libs

    如果比较libs/vs.Lib/您会发现后者充满了*.py文件,而前者有*.Lib文件.对文本编辑器的进一步研究将显示*.py文件是人类可读的(我希望如此),而*.lib文件则不是.在 这就是真正的区 ...

  • 这个神器,把打包Python脚本为exe的流程都封装好了

    Auto-py-to-exe 能够基于简单的GUI图形界面和Python中的 PyInstaller,将.py转换为.exe,非常容易使用,适合那些需要在windows上直接执行py文件但又没有Pyt ...

  • 把你开发的网站免费发布到互联网上(2)

    前几天,我们介绍了通过 PythonAnywhere 在互联网上创建一个站点: 把你开发的网站免费发布到互联网上(1) 本篇是上一篇的延续,来讲一讲如何将已有的 Django 项目部署到 Python ...

  • 在QT C++中调用 Python并将软件打包发布(裸机可运行)

    为了提高工作效率,需要一个可以自动生成多份相关联的word文档免去繁琐复制粘贴工作的软件.最后选定使用QT C++做界面和主要逻辑程序设计,对word的操作使用python写好对应的函数,然后在QT中 ...

  • jmeter压测学习38-通过Jython调用Python脚本

    前言 前面在 BeanShell 里面是通过 java 脚本实现请求的预处理,jmeter里面也可以调用python的脚本,需安装 jython.jar 的插件. Jython 是 Python 的纯 ...

  • reticulate包 | 在Rmarkdown中调用Python代码

    Python和R是一对数据科学两大语言,在互联互通的路上,我感觉R更加的积极.还记得之前 Python中调用R的库-rpy2, 在Python使用R语言语法还是有些不自然.在R中调用Python体验十 ...

  • 'Python替代Excel Vba'系列(终):vba中调用Python

    系列文章 '替代Excel Vba'系列(一):用Python的pandas快速汇总 'Python替代Excel Vba'系列(二):pandas分组统计与操作Excel 'Python替代Exce ...

  • 如何在Excel中调用Python脚本,实现数据自动化处理

    这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理日常工作. 说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球仍有7.5 ...

  • C#调用python脚本并传递参数的一种方法

    最近正好用python做了一个程序,由于是没有UI界面,使用起来没那么方便,同事建议将他做一个UI界面,方便操作,但又由于不想搞什么QT或者是Tkinter(太麻烦,其实真正的原因是我更擅长C#,手动 ...

  • C#调用Python的最优方式

    BIMCoder梁老师 BIMCoder梁老师 2020-07-03 原文链接 https://mp.weixin.qq.com/s?src=11&timestamp=1609665236&a ...

  • aardio 调用 Python 支持指定命名参数

    aardio 虽然小,但很适合借力打力,别的编程语言再强再好也可以为我所用,仅仅是能调用当然是不够的,我们还需要极简洁.极方便.极舒适才能借力打力得痛快. 不同编程语言总是有这样那样的区别,要跨越不同 ...

  • SPL 中调用 Python 程序

    集算器是强大的数据计算引擎,但目前对于机器学习算法的提供还不够丰富.而 python 中有许多此类算法.借助 YM 外部库,就可以让集算器 SPL 调用 python 写的代码,从而弥补这一不足.下面 ...