提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、问题分析
  • 二、解决方案
    • 第一个问题
    • 第二个问题
  • 三、结果及源码
  • 四、总结

前言

关于C#如何调用Python,网上提供了很多解决方案,有用ironPython的,也有把python代码打包成exe的,还有通过process类调用python的,但这些方案或多或少都有一些缺陷,比如ironPython无法调用第三方库,打包成exe运行速度太慢等。本文主要针对Process类调用python分发给别人使用时候需要安装python环境的问题提出一个解决方案。


提示:以下是本篇文章正文内容,下面案例可供参考

一、问题分析

C#如何调用Python,有一个很经典的解决方案,就是使用C#的Process类创建一个进程,这个进程实际上是为了Python解释器所开辟的,通过这个进程就可以完美调用Python代码了。这个方案的原理其实就相当于你自己使用python解释器去执行一段python代码,只不过“使用Python解释器”这个过程不是手动执行的,而是C#通过process类自动执行。关键代码见下

            Process P = new Process();//当前debug目录路径string curPath = System.Environment.CurrentDirectory;//需要调用的python代码文件string path =  curPath + "\\" + sArgName;//python解释器的路径P.StartInfo.FileName = curPath + "\\" + "python3\\python.exe";//传递的参数,注意,参数数组从0开始索引,第0个参数永远是python代码路径//从第一个参数开始是函数的形参string sArguments = path;

这里有两个问题:
第一个,当python代码中调用了第三方库,python解释器如何知道去哪里找到第三方库的位置。
第二,当分发给一个没有装过Python的用户使用时,怎样可以不让用户下载Python,而是可以直接使用。

二、解决方案

第一个问题

如果Python代码中引用了第三库,那么Python解释器会从它的同级目录、环境变量以及手动添加的目录中寻找相应的库。从python的安装目录我们就可以明白这一点,下图是笔者的python安装目录

当你调用了Python.exe时,其会在同级目录中的LIB文件夹中的site-packages文件夹搜索对应的第三方库,找到了则会成功运行,反之则报错。

第二个问题

分发给用户时,若用户没有安装python环境,则在你电脑能运行的代码,在用户那边会因为找不到相应的模块而报错。一般的解决方案是给用户安装一个python环境,但这样无疑会影响用户体验,最好的解决方案是在分发过去的工程文件中将python环境配置好。
从第一个问题中可以得到启发,python解释器会在同级目录中找寻第三方库以及其他依赖的文件,那我们可以在工程文件中新建一个python文件夹,然后再其中配置python的环境。具体操作很简单,只需要把安装python解释器的那一个文件夹的东西全都复制过去就行。当然,这样的话,文件夹可能会很大,这一般是因为site-packages中的第三方库较多。只需要在复制的时候只保留site-packages中的相关库,其他无关的全都删除就可减小空间,比如笔者的demo中需要c#调用python的opencv去显示图片,那么site-packages中需要保留opencv和numpy库就行。见下图


三、结果及源码

 private void button2_Click(object sender, EventArgs e){//打开图片文件OpenFileDialog ofd = new OpenFileDialog();ofd.Title = "请选择图片文件";ofd.InitialDirectory = @"C:\Users\17116\Desktop";ofd.Filter = "图片文件|*.*";ofd.ShowDialog();url = ofd.FileName;string[] strArr = new string[2];//参数列表string sArgName = "main.py";//调用的.py文件名//strArr[0] = textBox1.Text;//strArr[1] = textBox2.Text;strArr[0] = url;RunpythonScript(sArgName, strArr);//运行python}public static void RunpythonScript(string sArgName, params string[] teps){Process P = new Process();//当前debug目录路径string curPath = System.Environment.CurrentDirectory;//需要调用的python代码文件string path =  curPath + "\\" + sArgName;//python解释器的路径P.StartInfo.FileName = curPath + "\\" + "python3\\python.exe";//传递的参数,注意,参数数组从0开始索引,第0个参数永远是python代码路径//从第一个参数开始是函数的形参string sArguments = path;foreach (string sigter in teps){sArguments += " " + sigter;//传递参数,两次之后为 路径 参数一 参数二}P.StartInfo.Arguments = sArguments;//启动python需要的命令语句P.StartInfo.UseShellExecute = false;P.StartInfo.RedirectStandardOutput = true;P.StartInfo.RedirectStandardInput = true;P.StartInfo.RedirectStandardError = true;P.StartInfo.CreateNoWindow = true;P.Start();P.BeginOutputReadLine();//在应用程序的output流上异步读取数据P.OutputDataReceived += new DataReceivedEventHandler(P_OutputDataReceived);//事件触发器,有新的数据就读取P.WaitForExit();}//用于C#和python之间字符串类型数据的传递static void P_OutputDataReceived(object sender, DataReceivedEventArgs e){//if (!string.IsNullOrEmpty(e.Data))//如果字符串存在//{//    MessageBox.Show(Convert.ToString(e.Data));//显示结果//}}

main.py中的python代码

import cv2
import sysdef add(a,b):return (float(a) + float(b))def imgshow(path):img = cv2.imread(path)cv2.imshow("img",img)cv2.waitKey()imgshow(sys.argv[1])
# print(add(sys.argv[1],sys.argv[2]))# if __name__ == '__main__':
#     print(add(sys.argv[1],sys.argv[2]))

点击图中的选择图片按钮,c#就会调用main.py文件,并通过opencv显示图片

四、总结

本文通过process类调用python,可以使用python的第三方库,并且分发给用户的时候也不需要安装python环境。但还有一个不足之处:图片等非字符串类型的数据传输问题。这是两个不同的进程,如何把python处理好的图片数据直接加载进c#的内存中,而不是通过文件的读取方式(这样会很慢),是后续的完善方向。
最后再列举几个还没实验过的C#调用python的思路:
1.使用 Python.NET 库:Python.NET 是一个用于在 .NET 平台上运行 Python 代码的库,它提供了 C# 和 Python 之间的接口。您可以使用 Python.NET 库,在 C# 程序中调用 Python 代码。

2.使用 Pyjion:Pyjion 是一个开源的 JIT 编译器,它可以将 Python 代码编译为 .NET 的机器码。您可以使用 Pyjion,在 C# 程序中调用编译后的 Python 代码。
P.S.需要完整代码的可以在这个链接下载,博主也需要一些积分来下载资源,感兴趣的希望能多多支持一下。完整代码下载

c#和Python交互,完美解决Python调用OpenCV等第三方库以及分发时需配置python环境的问题相关推荐

  1. 從turtle海龜動畫 學習 Python - 高中彈性課程系列 3 烏龜繪圖 所需之Python基礎

    "Talk is cheap. Show me the code." ― Linus Torvalds 老子第41章 上德若谷 大白若辱 大方無隅 大器晚成 大音希聲 大象無形 道 ...

  2. 完美解决:调用sklearn出现诸如ImportError: cannot import name ‘LogisticR‘ from ‘sklearn.linear_model‘ (D:\Progr

    1.问题:调用sklearn出现诸如 ImportError: cannot import name 'LogisticR' from 'sklearn.linear_model' (D:\Progr ...

  3. 完美解决 Linux服务器上如何跑代码以及如何导入自定义的python包

    一.问题描述 最近在阿里云买了一个服务器,于是就想着试试看能不能把自己本地上的代码放到服务器上去运行,这样既可以不消耗自己的cpu,还可以跑代码,一举两得.那么在实现的过程中就遇到了些问题,发现自定义 ...

  4. Python脚本完美解决Linux环境解压.zip文件乱码问题

    1.vi uzip(文件名) 2.复制以下Python程序 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # uzip.py 4 5 impo ...

  5. 【Python】完美解决Pycharm网站无法访问问题

    解决Pycharm网站无法访问问题 在我们输入网站:https://www.jetbrains.com/时会出现如下问题: 无法访问这个网站 嗯-无法访问此页面 原因:因为你之前有安装过破解版pych ...

  6. python怎么封装方法然后调用_Python实现封装打包自己写的代码,被python import

    1.新建一个文件夹example,里面放入要打包的.py文件,以及必需的_init_.py. 代码如下: # -*- coding: utf-8 -*- """ Crea ...

  7. python 包 子文件夹调用_15步,你就能拥有自己的Python程序包

    每个软件开发员和数据科学家都难免要做程序包.本文推荐一篇Python开源程序包的制作指南,希望这个包含了具体操作步骤的指南能让你在构建程序包时不用花那么多耐心和时间.(适用于macOS系统的Pytho ...

  8. 【已解决】python安装wordcloud、pymssql等第三方库的时候提示安装失败:Microsoft Visual C++ 14.0 is required...

    (一)问题描述 在使用  pip install <库名>  安装wordcloud.pymssql等库的时候报错为: error: Microsoft Visual C++ 14.0 i ...

  9. centOS升级python版本,解决报错These critical programs are missing or too old: make python

    最近编译GLIBC的时候报了这么一个错误: LINUX These critical programs are missing or too old: make python 从错误来看应该是pyth ...

最新文章

  1. 信息记录拉取失败_天猫入驻为什么失败?猫店侠做详细解读
  2. 苏联曾经的AI有多强?一段几乎已被世人遗忘的往事
  3. 您对TOP Server的德语、中文和日语语言支持了解吗?(二)
  4. 腐蚀单机怎么进_华强北淘来的iPhone6S,进水后严重腐蚀,小伙飞线拯救又赚到了!...
  5. 永洪Desktop关于MAC系统使用问题
  6. CONCAT 联合查询
  7. Eureka服务注册中心---SpringCloud
  8. 十六进制转化为十进制
  9. 数据结构--栈--顺序栈/链式栈(附: 字符括号合法配对检测)
  10. Mozilla 重磅推出物联网平台 WebThings!| 极客头条
  11. python转行符-python实现readline去掉换行符 等特殊字符
  12. zuul网关_Spring Cloud第五章:服务网关Zuul
  13. DICOM医学图像处理:利用fo-dicom发送C-Find查询Worklist
  14. 使用metasploit制作钓鱼网站——browser autopwn攻击
  15. Vercel部署个人博客
  16. golang 微信小程序登录
  17. Mac SecureCRT安装、破解和使用(mac版)
  18. 几何之父欧几里得的故事
  19. VOT Toolkit环境配置与使用
  20. linux 图片编辑 java_ImageJ For Linux x64(免费开源图片编辑软件)V1.49v官方版下载 - 下载吧...

热门文章

  1. 贪心算法适用条件_【算法】贪心算法
  2. 《逆向工程核心原理》学习笔记一
  3. caxa图文档服务器未启动,CAXA服务器及相关推荐配置.doc
  4. WIN 10系统丢失MSVCR110.dll和MSVCP110.dll问题
  5. 素食健康:八种素食助你清除体内废物
  6. 神经网络算法基本介绍,简单神经网络算法原理
  7. 成员函数与非成员函数的使用与区分
  8. 麻将Lucky Go颠覆传统摸牌玩法
  9. Delaunay三角剖分—三角网生长算法
  10. 服务器装系统不能建c盘,如何解决无法在C盘安装win7系统问题