在VS2017中用C#调用python脚本的实现

这里提供了一种寻常的方法,在VS2017中通过C#调用Python脚本的实现,具体过程如下:

准备工作

  1. 安装 Python3.x 及 pip,并添加环境变量;
  2. 安装 Python 的 C++ 接口库:pip install pybind11
  3. 安装 Python 的包管理器 pipenv:pip install pipenv
  4. 新建一个 .NET Framework Console 项目;
  5. 安装 NuGet 包:Microsoft.Python.Core 和 Microsoft.Python.Core.Interpreter;

调用 Python 脚本

C#调用Python脚本需要用到的方法:completeSetup,runPython,shutdownPython。具体执行逻辑请看下面代码:

using Microsoft.Python.Core;
using Microsoft.Python.Core.OS;
using Microsoft.Python.Core.Services;
using Microsoft.Python.Tools.Interpreter;

using static Microsoft.Python.Core.DisposableHelpers;

private IPythonInterpreter _interpreter;
private IServiceManager _services;

public void completeSetup()
{
    var os = new Platform(OS.PlatformKind);
    _services = new ServiceManager();
    _services.AddService(new SystemModule(_services));
    _services.AddService(new OsModule(os, _services));
    _services.AddService(new SysModule(_services));
    _services.AddService(new ArgvModule(new[] { "app" }, _services));
    _services.AddService(new BuiltinModule(_services));
    _services.AddService(new BuiltinImporter(_services));
    _services.AddService(new AstPythonInterpreterFactory(_services));
    _services.AddService(new AstPythonInterpreterSettings(_services));
}

public void runPython(string pyCode)
{
    var script = _interpreter.CreateScriptSourceFromString(pyCode);
    script.Execute();
}

public void shutdownPython()
{
    _interpreter = null;
    _services.Dispose();
    _services = null;
}

public void init()
{
    completeSetup();
    var factory = new AstPythonInterpreterFactory(_services);
    var options = new InterpreterConfiguration
    {
        InterpreterPath = @"yourPythonPath",
        LibraryPath = PythonPaths.Python35.Libraries.PythonLibrary,
        UseDefaultDatabase = true,
        DatabasePath = PythonPaths.GetCachedDatabasePath(factory.Configuration, factory.GetCacheFolderPath())
    };
    _interpreter = factory.CreateInterpreter(options);
}

代码的执行流程:首先在init方法中初始化Python环境,这个和Python的交互操作似乎也可以用到。completeSetup方法用来整合该项目使用的Python包,runPython函数用于执行Python代码,shutdownPython用于应用程序关闭时关闭Python环境。

另外,还有一个 IPythonModuleManager 接口和无法应用上下文的对象,因此必须手动添加包:

_services.AddService(new PythonPackageManager(new PipPackageManager(_services), _services));
_services.AddService(new AstPythonModuleManagement(_services, null));

其中第二个参数传 null,Python的上下文暂时不考虑。

示例一

使用Python脚本进行图像处理。例如,Python脚本如下:

from PIL import Image

def doSomething():
    img1 = Image.open("one.jpg")
    img2 = Image.open("two.jpg")
    img1_size = img1.size
    img2_size = img2.size
    joint_height = img1_size[1] + img2_size[1]
    joint_width = max(img1_size[0], img2_size[0])
    joint_image = Image.new('RGB', (joint_width, joint_height))
    joint_image.paste(img1, (0, 0))
    joint_image.paste(img2, (0, img1_size[1]))
    joint_image.save("image.jpg")

doSomething()

那么,如何在C#中调用Python代码里面的 doSomething 呢?使用我们先前完成的 PythonRunner,调用函数即可:

init();

string pythonScript = @"from PIL import Image
def doSomething():
    img1 = Image.open(""one.jpg"")
    img2 = Image.open(""two.jpg"")
    img1_size = img1.size
    img2_size = img2.size
    joint_height = img1_size[1] + img2_size[1]
    joint_width = max(img1_size[0], img2_size[0])
    joint_image = Image.new('RGB', (joint_width, joint_height))
    joint_image.paste(img1, (0, 0))
    joint_image.paste(img2, (0, img1_size[1]))
    joint_image.save(""image.jpg"")

doSomething()";

runPython(pythonScript);

shutdownPython();

直接调用 doSomething() 方法。

然后,我们把 one.jpg 和 two.jpg 放在项目文件中,并编译运行程序,可以在项目目录下找到 image.jpg 图片。

示例二

使用Python脚本进行爬虫,例如:

from urllib import request
import chardet

def getHTMLText(url):
    headers = {'User-Agent':'Mozilla/5.0'}
    req = request.Request(url,headers=headers)
    response = request.urlopen(req)
    html = response.read()
    html = html.decode(chardet.detect(html)['encoding'])  
    return html

def doSomething():
    url = "https://movie.douban.com/cinema/nowplaying/beijing/"
    html = getHTMLText(url)
    print(html[:1000])

doSomething()

那么,在C#中调用 doSomething 方法的代码如下:

init();

string pythonScript = @"from urllib import request
import chardet

def getHTMLText(url):
    headers = {'User-Agent':'Mozilla/5.0'}
    req = request.Request(url,headers=headers)
    response = request.urlopen(req)
    html = response.read()
    html = html.decode(chardet.detect(html)['encoding'])  
    return html

def doSomething():
    url = ""https://movie.douban.com/cinema/nowplaying/beijing/""
    html = getHTMLText(url)
    print(html[:1000])

doSomething()";

runPython(pythonScript);

shutdownPython();

运行程序可以看到 C# 输出的 Python 脚本执行结果。

总的来说,通过在 VS2017 中使用 C# 调用 Python 脚本的方法是比较简单的,而且这种方法可以用于在两种不同编程语言之间建立桥梁,让它们之间相互调用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在VS2017中用C#调用python脚本的实现 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • .NET Core跨平台串口通讯使用SerialPortStream基础类库问题解决

    .NET Core跨平台串口通讯使用SerialPortStream基础类库问题解决 串口通讯在很多行业应用中都有着重要的地位,而串口通讯的跨平台解决方案在.NET Core 3.0之后,就有了更好的支持。本文将介绍如何使用SerialPortStream基础类库进行.NET Core跨平台串口通讯,并解决其中的常见问题。 安装SerialPortStrea…

    C# 2023年6月3日
    00
  • php通过淘宝API查询IP地址归属等信息

    下面是 “php通过淘宝API查询IP地址归属等信息”的完整攻略: 1. 获取淘宝API的AppKey 在使用淘宝API之前,我们需要先获得AppKey。具体步骤如下: 进入淘宝开放平台官网:https://open.taobao.com/ 点击“控制台”->“应用管理”->“创建应用”,按照提示进行填写并提交。 提交申请后,等待审核通过,审核通…

    C# 2023年6月1日
    00
  • C#实现对文件进行加密保护的示例代码

    下面是“C#实现对文件进行加密保护的示例代码”的完整攻略。 一、引言 对文件进行加密保护是信息安全领域中的一个重要问题。C# 是一种流行的编程语言,也是.NET平台的核心语言之一。在C#中,我们可以很容易地实现对文件的加密保护。本文将分享一些如何使用C#加密你的文档的方法和示例代码。 二、C#实现对文件进行加密保护的示例代码 下面是一个简单的示例代码,演示了…

    C# 2023年6月1日
    00
  • 通过C#实现自动售货机接口

    通过C#实现自动售货机接口的完整攻略如下: 一、了解接口 在开始编写自动售货机接口之前,需要先了解什么是接口。接口(Interface)是一种抽象的类型,它定义了让其他程序集(Assembly)访问该程序集的功能。通过接口,可以使一个类实现多个不相关的类型。 二、创建项目 打开Visual Studio,创建一个新的C#控制台应用程序项目; 在解决方案资源管…

    C# 2023年6月1日
    00
  • 解析.NET中几种Timer的使用

    解析.NET中几种Timer的使用 在.NET平台下,有多种Timer,包括System.Timers.Timer、System.Threading.Timer等。本文将对这些Timer进行详细讲解,让您可以选择最适合您需求的Timer进行使用。 System.Timers.Timer System.Timers.Timer是一个基于事件的Timer,可以在…

    C# 2023年6月1日
    00
  • VSCode配置C#运行环境的完整步骤

    下面是VSCode配置C#运行环境的完整步骤攻略。 一、安装 .NET Core SDK 首先我们需要安装 .NET Core SDK,这是 .NET Core 的主要开发框架,它提供了用于构建和运行 C# 应用程序所需的工具和环境。我们可以前往 官网 下载适合自己操作系统版本的 .NET Core SDK。 安装完成后,我们可以在控制台(或者终端)输入 d…

    C# 2023年6月7日
    00
  • BackBone及其实例探究_动力节点Java学院整理

    BackBone及其实例探究攻略 简介 Backbone是一个轻量级的JavaScript框架,可用于建立单页Web应用程序。它提供了一个基于Restful JSON接口的MVC(模型-视图-控制器)框架。Backbone实现了模块化开发,提供了事件绑定、复合模型、集合等功能。通过使用Underscore库,Backbone实现了诸如数据绑定和快速原型等功能…

    C# 2023年5月31日
    00
  • 一文掌握C# JSON(2023最新整理)

    一文掌握C# JSON(2023最新整理) 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript的一个子集,可以被多种编程语言读取和写入。JSON格式最初由 Douglas Crockford 提出,现已成为一种公认的数据交换格式。 C#中使用JSON的方式 C#中有多种库可…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部