c#与python 交互(调用第三方库)

我是文明,文章来源于项目实践,以下即代表我的个人认同与看法,有不同看法的可以留言哈,谢谢你的阅读,文章有错字或代码错误请指正,谢谢你哦。

由于项目项目需求,必须使用python的方式研发项目,使用c#调用python。

项目需求:使用python的方式叠加遥感tifi影像!python代码制图!使用的第三方库有:

Ironpython

实验一:使用c# Ironpython 库,必须安装python和集成环境,IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,使用动态类型系统以让更多脚本语言能很容易地移植到NET Framework上。但是不能使用pip安装(我最喜欢pip了,可惜了),因为pip没有.egg文件,必须引用.egg的文件才能使用。第二,安装过程的有点麻烦!想哭!啊!!!!!!!。

  如果没有底三方库的话,这个Ironpython包完美!但是我的项目三方库不少呀,做为小白的我,直接放弃!!!!(笑脸表情哈哈)

调用核心代码:

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;


ScriptEngine PyEngine = Python.CreateEngine();
ScriptScope PyScope = PyEngine.CreateScope();
ScriptSource PySource = PyScope.CreateScriptSourceFromFile("test01.py");
PySource.Execute(PyScope);

pyInstaller To exe

//download.csdn.net/download/wenming111/10668853?utm_source=bbsseo 这里有下载链接,实现不了可以留言!谢谢!!

1、思路:

使用pyInstaller 把第三方包等生成exe文件,c#调用他,接受参数sys.argv[1]     Process.StartInfo.Arguments方法传递参数

核心代码如上!这个方法堪称完美!我是太懒了就使用了这个比较简单的方法了!应为本项目需要必须打包成独立程序,不能让客户也安装python和python环境吧!!!

2、具体调用如下:

   using System.Diagnostics;   


   Process process = new Process();
   process.StartInfo.FileName = Application.StartupPath + @"‪‪readimagecv2.exe";
   process.StartInfo.UseShellExecute = false; //必需
   process.StartInfo.RedirectStandardOutput = true;//输出参数设定
   process.StartInfo.RedirectStandardInput = true;//传入参数设定
   process.StartInfo.CreateNoWindow = true;
   process.StartInfo.Arguments = "ur'F:/matplotlib/ano_2014364.tif' ur'F:/matplotlib/geosj.tif' ur'F:/matplotlib/ano_2014364.shp'";
     //参数以空格分隔,如果某个参数为空,可以传入””
   process.Start();
   string output = process.StandardOutput.ReadToEnd();//结果
   process.WaitForExit();//等待外部程序退出
   process.Close();
 path =sys.argv[1]   #接收第一个参数
 sjpath = sys.argv[2]  #接收第二个参数
 shpfilename =sys.argv[3]  ##接收第三个参数

如果不封装,可以在cmd中直接调用,封装之后就不能使用了,(如果,不打包成exe,直接调用.py文件,加参数,是绝对可以运行的,但是实践证明,打包成exe之后就不那么好用了,但是,如果想继续传参的话,使用配置文件是个不错的方法)

注:如果c#在执行process.Start()中出错,请调用bat文件执行命令。略

3、出现的问题:传参exe:c#在执行process.Start()错误:找不到文件系统

解决方案:1)在cmd命令行中执行传参代码,出现”failed to execute script 脚本名” 请检查参数,或者打包文件由问题,请使用

https://download.csdn.net/download/wenming111/10675350 命令行执行

2)c#在执行process.Start()错误:找不到文件系统 请将文件放到c盘执行,Windows10 对有不同磁盘的电脑存在权限问题,尝试放在c盘和不放在c盘执行操作。如果以上方式不友好,请使用3.

3)使用配置文件如xml、ymal方式在c#与python之间传递参数。

c#中使用解析类进行模块编写:

/*ymal文件格式:
  WorkPath:
    Path:
*/
    //解析yml类:
        private string MapConfigFile="F:\\wk\\plot.ymal";
        private MapConfigSet cfg;
        public void ReadConfig()
        {
            this.cfg = Deserializer<MapConfigSet>(MapConfigFile);
        }
        public static T Deserializer<T>(string _file)
        {
            if (!File.Exists(_file))
            {
                throw new FileNotFoundException();
            }
            StreamReader yamlReader = File.OpenText(_file);
            Deserializer yamlDeserializer = new Deserializer();
            T info = yamlDeserializer.Deserialize<T>(yamlReader);
            yamlReader.Close();
            return info;
        }
        /// <summary>
        /// 保存配置
        /// </summary>
        public void SaveConfig()
        {
            StreamWriter yamlWriter = File.CreateText(MapConfigFile);
            Serializer yamlSerializer = new Serializer();
            yamlSerializer.Serialize(yamlWriter, this._cfg);
            yamlWriter.Close();
        }


      //ymal  结构 
      public class Config
        {      

            public Workpath WorkPath { get; set; }
         }

       public class Workpath
        {
            public string Path { set; get; }
        }

 python中使用:

config_path="F:/wk/plot.ymal"
file_yaml = open(config_path)  # 读取参数配置文件
        yaml_parameter = yaml.load(file_yaml)
        path = yaml_parameter["WorkPath"]["Path"]  

通过以上核心代码可实现c#与python的参数交互;

文字内容来源于实践!实践的东西最真实,至少我已经成功了 哈哈

打包之后的大小,因为包比较多,所以在自动打包的过程中比较大

 

 

发布了35 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/wenming111/article/details/82732241
今日推荐