C# 如何调用python,避免重复造轮子

这篇具有很好参考价值的文章主要介绍了C# 如何调用python,避免重复造轮子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原因

最近有个需求,需要按照填入的参数动态地生成对应word文件。excel文件我还有办法,word文件我是真没办法。我去.NET上面搜了一下C#支持的word编辑库,发现好像就NPOI支持word文件修改。我没办法网上所了好久,终于找到了对应的博客通过反射和泛型去解决模板化的文件填充。然后领导又给了我一个需求。

现在是能够用占位符去替换了,内容是动态的,现在个数也要动态的。比如我一个报表,有A,B,C三项内容,现在能把ABC三项填进去了。现在的需求是有多个ABC,1,5,10,20个。就是只有一个模板但是能自我复制。自己造轮子太麻烦了。

我后来看到python处理这些特别简单,后来我决定,C#去调用python,不重复造轮子。

Tips:我最后在ChatGPT上面找到方法了,国内C#相关的博客也太少了

Tips:我后来发现nuget上面有minWord和minExcel,专门用于模版文件导入导出,我到时候看一下

资源

这个是自己纯手撸了一个代码
C# 生成word文档(NPOI.XWPF)
这个是我网上逛github逛到的
C# MiniWord Gtihub官网
这个是这个作者另一个快速Excel文件,我感觉这个好像很好使
C# MiniExcel Gtihub官网

python的方法
Python docxtpl 操作 Word 模板文档

调用python文件

需求

如果我们要调用python代码或者文件,我们至少要做的一下几步:

主要要求

  • 能执行。至少我能运行python文件
  • 有返回。我能知道结果。
  • 能入参。我能将参数添加进去
  • 能同步。我能等待python运行完了之后再接着运行C#代码。

保证了这个我们就能勉强使用

次要要求

  • 宽松环境。我python版本、C#和.NET 版本都随意。我能随意pip install 任意版本的第三方库
  • 好部署:在一个新环境下面好部署。最好文件复制过去就能用。
  • 编写简单。我能很快的编写代码
  • 高效。保证一定的运行效率
  • 稳定。不容易出bug

解决方案

c#调用python的三种方法

1、C#里面运行python

太蠢了,我就直接写了

使用Pythonnet库:
Pythonnet是一个开源项目,可以直接在C#中调用Python。首先,需要在C#项目中安装Pythonnet库。可以使用NuGet包管理器或手动安装。

using System;
using Python.Runtime;

class Program
{
    static void Main()
    {
        using (Py.GIL()) // 获取全局解释器锁
        {
            dynamic py = Py.Import("module_name"); // 导入Python模块

            // 调用Python函数或访问Python对象
            dynamic result = py.FunctionName(param1, param2, ...);
            Console.WriteLine(result);
        }
    }
}

引入python文件,再调用其中的方法

C#使用IronPython调用Python

这个要安装Nuget第三方库。
C# 如何调用python,避免重复造轮子,C#,c#,python,开发语言

这个只能说勉强能用,凑合。因为他限定死了python的版本是3.4。你pip装的第三方库都要是能支持python3.4的。而且你的编译环境要和别的python环境隔离。

但是我们知道python所有版本都是有有效期的,好像是5~10年吧,过了有效期就不支持了。现在最新版的python已经是3.11了。

启动python脚本,监听返回值

这个我网上搜半天没找到,最后在chatGPT上面解决了。

using System;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        // 创建一个新的ProcessStartInfo对象
        ProcessStartInfo start = new ProcessStartInfo();
        // 设置Python解释器路径
        start.FileName = "path_to_python_interpreter";
        // 设置要执行的Python脚本路径及其参数(如果有的话)
        start.Arguments = "path_to_python_script.py arg1 arg2 arg3";

        // 设置为重定向输入和输出
        start.UseShellExecute = false;
        start.RedirectStandardOutput = true;
        start.RedirectStandardError = true;

        // 启动进程
        using (Process process = Process.Start(start))
        {
            // 读取标准输出和错误输出
            string output = process.StandardOutput.ReadToEnd();
            string error = process.StandardError.ReadToEnd();

            // 等待进程结束
            process.WaitForExit();

            // 输出结果
            Console.WriteLine("Output:");
            Console.WriteLine(output);
            Console.WriteLine("Error:");
            Console.WriteLine(error);
        }
    }
}

按照这个,我们可以创建一个新的文件,然后直接命名行执行,监听返回值。

改造一下,可以入参的python调用

C# 如何调用python,避免重复造轮子,C#,c#,python,开发语言

C# 如何调用python,避免重复造轮子,C#,c#,python,开发语言



import argparse
import time

parser = argparse.ArgumentParser(description='manual to this script')
# 这个是我们输入的两个参数
parser.add_argument("--name", type=str, default="0", help='input name')
parser.add_argument("--age", type=int, default=32,help='input total age')
args = parser.parse_args()


print(args.name)
print(args.age)


主函数

using C_python.Utils;
using System.Diagnostics;

namespace C_python
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ProcessStartInfo start = new ProcessStartInfo();
            // 设置Python解释器路径
            start.FileName = "python";
            // 设置要执行的Python脚本路径及其参数(如果有的话)
            start.Arguments = @"PythonFiles/test.py --name '哈哈哈' --age 849";

            // 设置为重定向输入和输出
            start.UseShellExecute = false;
            start.RedirectStandardOutput = true;
            start.RedirectStandardError = true;

            // 启动进程
            using (Process process = Process.Start(start))
            {
                // 读取标准输出和错误输出
                string output = process.StandardOutput.ReadToEnd();
                string error = process.StandardError.ReadToEnd();

                // 等待进程结束
                process.WaitForExit();

                // 输出结果
                Console.WriteLine("Output:");
                Console.WriteLine(output);
                Console.WriteLine("Error:");
                Console.WriteLine(error);

            }

            Console.WriteLine("运行完毕");
            Console.ReadLine();
        }
    }
}

运行结果

C# 如何调用python,避免重复造轮子,C#,c#,python,开发语言

查看是否等待python运行完成之后再运行C#

添加休眠


import argparse
import time

parser = argparse.ArgumentParser(description='manual to this script')
# 这个是我们输入的两个参数
parser.add_argument("--name", type=str, default="0", help='input name')
parser.add_argument("--age", type=int, default=32,help='input total age')
args = parser.parse_args()

print('我休眠1s')
time.sleep(1)

print('我再休眠1s')
time.sleep(1)

print(args.name)
print(args.age)

C# 如何调用python,避免重复造轮子,C#,c#,python,开发语言

Tips:我发现python文件选择始终复制不一定能每次修改都复制,还是得进debug文件里面改

如果参数比较复杂

我们不一定会用这么简单的参数,我们后面可能会输入上百行的复杂参数,用命令行就不一定好用了。

所有我们可以将参数写到一个文件里面,每次执行让python去读这个文件里面的数据。简单参数直接传,复杂参数存文件。自己去解析。

开一个python网络后端

理论上是可以的,想调用python功能直接往端口传数据就行了,但是感觉有点大炮打蚊子,没必要。python就是个辅助工具,能用就行。

总结

python有很多很好用的工具,如果我们编程的时候能很方便的调用python的工具帮我们做事情,可以减少很多不必要的麻烦,不用重复造轮子,快速开发,也能顺便学一下python。

当然,也可以在nuget上找对应的第三方库或者手撸一个工具。前者找起来很麻烦,要找好几天,而且尝试好不好用也很麻烦。后者更费时间,简单事情就不要重复地造轮子。我们编程序永远是需求为第一导向,能快速地解决是最好的。文章来源地址https://www.toymoban.com/news/detail-521646.html

到了这里,关于C# 如何调用python,避免重复造轮子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • xxljob后台集群部署如何避免重复执行任务

    工作中有一场景,后台部署2个节点,同时注册到执行器内,如何避免任务重复执行呢? 其实xxl-job本身已经考虑到这一点,我们只需要在创建任务的时候这样做就可以了: 路由策略:选择 一致性HASH 阻塞处理策略:选择 丢弃后续调度 引自:xxl-job官网

    2024年02月13日
    浏览(43)
  • 【消息队列】聊一下如何避免消息的重复消费

    一条消息在传输过程中,为了保证消息的不丢失,可能会多少量的消息进行重试,这样就可能导致Broker接受到的消息出现重复,如果说下游系统没有针对业务上的处理,那么可能导致同一笔借款或者支付订单出现重复扣款或者重复还款的情况。业务上是不允许出现的。 在MQ

    2024年02月10日
    浏览(45)
  • [C#] 如何调用Python脚本程序

    有以下几个原因需要C#调用Python: Python拥有丰富的生态系统:Python有很多强大的第三方库和工具,可以用于数据科学、机器学习、自然语言处理等领域。通过C#调用Python,可以利用Python的生态系统来完成一些特定的任务。 C#和Python的优势互补:C#是一种高性能、静态类型的编程

    2024年02月19日
    浏览(39)
  • 【python实操】如何通过简单拖拽直接开发软件,避免手写界面布局

    python学习之路任重而道远,要想学完说容易也容易,说难也难。 很多人说python最好学了,但扪心自问,你会用python做什么了? 刚开始在大学学习c语言,写一个飞行棋的小游戏,用dos界面来做,真是出力不讨好。 地图要自己一点一点画出来,就像这样: 从此讨厌编程,不想

    2024年01月16日
    浏览(89)
  • 别再重复造反射轮子了,Spring 中的 ReflectionUtils 工具类,应有尽有!

    作者:策马踏清风 链接:https://www.jianshu.com/p/756778f5dc87 ReflectionUtils 是 spring 针对反射提供的工具类。 推荐一个开源免费的 Spring Boot 实战项目: https://github.com/javastacks/spring-boot-best-practice 源码: 主要是将反射中的异常分成几个部分,规范化输出 boolean declaresException(Method meth

    2024年02月04日
    浏览(44)
  • RabbitMQ避免重复消费

    在Java中,可以使用消息队列来实现消息的异步处理,其中常用的消息队列有 RabbitMQ、ActiveMQ、Kafka 等。 什么是幂等性? 幂等性是指无论操作执行多少次,都是得到相同的结果,而不会产生其他副作用。 在rabbitMQ中 什么是消息重复消费? 同一条消息在MQ中被消费多次 出现重复

    2024年02月03日
    浏览(30)
  • kafka怎么避免重复消费

    首先,Kafka Broker上存储的消息都有一个Offset的标记,然后Kafka的消费者是通过Offset这个标记来维护当前已经消费的一个数据的。消费者每消费一批数据,Kafka Broker就会更新OffSet的一个值,避免重复消费的一个问题。 默认情况下,消息消费完成以后,会自动提交Offset这样一个值

    2024年04月15日
    浏览(51)
  • C++&Python&C# 三语言OpenCV从零开发(6):边界填充+Csharp调用Python matplotlib代码

    C++PythonCsharp in OpenCV 专栏 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记) 今天来接着学习OpenCV,现在主要是以Python代码为主了,所以先实现Python,在用C++/Csharp重现一遍。 边界填充就是向外填充图片信息,将图片扩大。填充分为上下

    2024年01月23日
    浏览(66)
  • C语言为什么会发⽣数据溢出?如何避免数据溢出?

            按正常的计算,sum 应该是2147483648,但是运⾏后 sum 的结果是-2147483648。这是什么原因呢?         在C语⾔中可以使⽤各种类型的标识符,但是C语⾔标准⾥并没有规定这些类型的具体⻓度,要由各个C编译系统⾃⼰规定。⼀般以⼀个机器字存放⼀个 int 数据,早

    2024年01月20日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包