【沧海拾昧】C#调用Python代码的方法

这篇具有很好参考价值的文章主要介绍了【沧海拾昧】C#调用Python代码的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#C0204


沧海茫茫千钟粟,且拾吾昧一微尘

——《沧海拾昧集》@CuPhoenix


【阅前敬告】
沧海拾昧集仅做个人学习笔记之用,所述内容不专业不严谨不成体系
【如有问题必是本集记录有谬,切勿深究】


前言

  在使用 C# 调用 Python 代码时,有多种方法,如将Python封装为动态链接库 .dll 、用 IronPython 作为移植的依赖库直接调用 Python 的函数接口等,但在开发时最简单实用的方法莫过于利用 C# 命令行调用 .py 文件执行

  本文记录了在利用 C# 命令行调用 .py 文件执行的方法与可能遇到的常见问题。


一、测试环境准备

  为演示如何 C# 命令行调用 .py 文件执行,本例的实现功能与准备如下:

实现功能:

  • 单击 C# 窗口中的 button1,调用 .py 文件执行一个简单的加法,并将值传回给窗口,显示在 button1.Text 上。

软件版本:

  • Python 3.6.2 (x86)
  • Visual Studio 2019

二、实现过程

1、准备 .py 文件

  准备一段功能简单的 Python 代码作为样例测试所用。代码如下:

#main.py

import sys
import ctypes
from ctypes import *

def func(a,b):
    mydll = CDLL("F:/xxxxx/TestDll.dll")    # 强烈建议使用绝对路径
    result = mydll.add(a, b)
    return result

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

代码说明:

  • 代码中使用的import ctypesfrom ctypes import *mydll = CDLL("xxxx")这一部分用于引入一个自编的 .dll 库,这个库里一个 add 函数用以执行两个整型数相加,这个库是通过 C++ 实现的,实现了 Python 中调用 C++ 代码,详情可参见《》。
  • 在测试时,可删去上述三行,并改写result = mydll.add(a, b),为 result 赋值。
  • mydll = CDLL("F:/Test/Debug/Test Dll1.dll") 强烈建议使用绝对路径,注意 Python 中的路径分割符是 / 不是 \
  • 返回值用 print 直接输出即可。

2、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.Threading.Tasks;
using System.Windows.Forms;

namespace Project1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
		// 单击按钮触发测试
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                string path = @"F:\xxxxx\main.py";  // 所需调用的 .py 文件的绝对路径
                StartTest(path, 1, 2);
            }
            catch (Exception e1)
            {
                MessageBox.Show(e1.Message);
            }
        }
        
        //调用python核心代码
        private Process progressTest;
        public bool StartTest(string pathAlg, int a, int b)
        {
            bool state = true;

            if (!File.Exists(pathAlg))
            {
                throw new Exception("The file was not found.");
            }
            string sArguments = @"""" + pathAlg + @"""";  // 进一步处理路径。在路径前后加上双引号。
            sArguments += " " + a.ToString() + " " + b.ToString() + " -u";	 // 加上传入的参数

            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;

            progressTest = Process.Start(start);
            // 为异步获取订阅事件
            progressTest.OutputDataReceived += new DataReceivedEventHandler(outputDataReceived);
            // 异步获取命令行内容
            progressTest.BeginOutputReadLine();
            progressTest.BeginErrorReadLine();
            
            return state;
        }

        public void outputDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (!string.IsNullOrEmpty(e.Data))
            {
                this.Invoke(new Action(() => {
                    this.button1.Text = e.Data;  // e.Data中是 .py 执行完传回的值
                }));
            }
        }
    }
}

代码说明:

  • 程序中使用到了文件的读取和 Process 类,因此必须引入System.DiagnosticsSystem.IO
  • string sArguments = @"""" + pathAlg + @""""; 一步,用于为路径前后加上双引号,否则在控制台执行命令时,无法正确处理路径中的空格,导致调用失败。@ 是 C# 中的字符串的转义符,“”用于转义出一个双引号。即:@"""" 是只含有一个双引号的 string 。
  • ProcessStartInfo.sArguments 中是用以执行的命令行,其在 cmd 中的形式是 python "绝对路径/xxxx.py" a b ,其中 a 、 b 是向 .py 文件中传入的参数。在 C# 中使用,仅需将ProcessStartInfo.FileName 的值设为 @"python" (需要事先配置好 Python 的环境参数,否则必须使用绝对路径),然后将ProcessStartInfo.sArguments的值设为"绝对路径/xxxx.py" a b 即可。
  • OutputDataReceived 事件中传入的 DataReceivedEventArgs e.Data 中记录了 .py 输出到控制台命令行的值。

3、运行结果

c#调用python,# C# .Net桌面开发,c#,python

运行结果,成功调用 .py 中的代码

敬谢诸君。


京华西山之巅。文章来源地址https://www.toymoban.com/news/detail-619713.html

到了这里,关于【沧海拾昧】C#调用Python代码的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

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

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

    2024年02月12日
    浏览(45)
  • C#使用IronPython调用Python脚本实例

    本文 详细讲解在C#中调用Python脚本的 实例 。 首先 本文假设您已经安装好了Python环境和对应的库。 目录 一、IronPython简述

    2024年02月10日
    浏览(41)
  • .NET Core(C#) IEqualityComparer<in T>接口的使用方法及示例代码

    .NET Core(C#)中IEqualityComparerT接口的对象的主要作用是实现接口来判断两个对象是否相等,以下介绍一下 IEqualityComparerin T接口的简单介绍和实现使用的方法,以及相关示例代码。   1、IEqualityComparerin T的的GetHashCode和Equals方法 IEqualityComparerin T 是用来比较对象是否相等,需要实现

    2024年02月09日
    浏览(68)
  • 通过python在unity里调用C#接口

    log: 背景 最近在做虚拟人底层驱动sdk测试,因为后端使用的是C#,我个人更倾向于python编程辅助测试工作,测试sdk需要通过开发提供的接口方法文档,通过传测试场景参数调用方法进行单元测试 技术工具 项目语言 C# 项目工具 unity 测试语言 python3 实现过程 1.首先需要在unity安装

    2024年02月04日
    浏览(31)
  • LabVIEW生成.NET的DLL——C#下调用NI数据采集设备功能的一种方法 [www.cnblogs.com/helesheng]

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 LabVIEW是NI公司的数据采集设备的标准平台,在其上调用NI-DAQmx驱动和接口函数能够高效的开发数据采集和控制程序。但作为一种图形化的开发语言,使用L

    2024年02月04日
    浏览(43)
  • 【沧海拾昧】STM32F103C8T6/C6T6的ISP烧录

    #C0105 沧海茫茫千钟粟,且拾吾昧一微尘 ——《沧海拾昧集》@CuPhoenix 【阅前敬告】 沧海拾昧集仅做个人学习笔记之用,所述内容不专业不严谨不成体系 【如有问题必是本集记录有谬,切勿深究】   对于某种STM32F103C8T6/C6T6最小系统板,没有配置J-LINK/ST-LINK烧录口,此时可以

    2024年02月03日
    浏览(68)
  • C# .NET 如何调用 SAP RFC 接口

    1.分析传参结构 SAP 传参格式对应 .NET 参数格式 SAP 参数 .NET 参数 参数类型 import(导入)——关联类型为数据元素 Param 单个变量参数 import(导出)——关联类型为结构体 Struct 结构体 table Table 表 下面是 SAP 对应参数类型: 2.web.config 配置 配置文件需要客户端名和连接地址和账户密

    2024年02月13日
    浏览(33)
  • C#开发DLL,CAPL调用(CAPL>> .NET DLL)

    ret为dll里函数返回的值。 在visual studio中建立。

    2024年02月08日
    浏览(43)
  • c#和Python交互,完美解决Python调用OpenCV等第三方库以及分发时需配置python环境的问题

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 关于C#如何调用Python,网上提供了很多解决方案,有用ironPython的,也有把python代码打包成exe的,还有通过process类调用python的,但这些方案或多或少都有一些缺陷,比如ironPython无法调用第三方库,打包成

    2024年02月05日
    浏览(50)
  • C#使用Asp.Net创建Web Service接口并调用

    目录 一.创建Asp.net web应用以及Web Service服务 (1).运行环境 (2)创建项目 二.创建控制台应用来调用上面创建的Web Service 开发工具: Visual Studio 2022 Current (免费社区版) 框架版本: .net framework4.7.2,更高的.net 5 、net6貌似没有默认提供带web service的asp.net 应用模板了。 确保VS的工作负荷有

    2024年01月18日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包