iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >IronPython初体验
  • 557
分享到

IronPython初体验

初体验IronPython 2023-01-30 22:01:09 557人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

介绍 在 C# 程序中嵌入 Ironpython 得到了很好的支持。在本教程中,我们将展示如何完成这个项目。 首先,我们将展示两个非常基本的例子,说明如何执行一个不导入任何模块的非常简单的脚本。然后,再展示如何执行使用模块的脚本。 在 C

介绍

在 C# 程序中嵌入 Ironpython 得到了很好的支持。在本教程中,我们将展示如何完成这个项目
首先,我们将展示两个非常基本的例子,说明如何执行一个不导入任何模块的非常简单的脚本。然后,再展示如何执行使用模块的脚本。

C# 中执行 Python

第一个例子

我们来创建一个执行Python脚本的 C# 应用​​程序的简单例子。我们使用 Visual Studio 2017 C# 控制台应用程序模板创建一个新项目。我们称之为PythonScriptExecution1。完整的例子可以从我们的GitHub仓库获得:IronPythonTutorials / CSharpIntegration / PythonScriptExecution1。
项目创建完成后,我们使用 NuGet 包管理器添加 IronPython 包,将其安装到当前项目中。这会将以下程序集添加到项目中:

  • IronPython
  • IronPython.Model
  • IronPython.sqlite
  • IronPython.WPF
  • Microsoft.Dynamic
  • Microsoft.Scripting
  • Microsoft.Scripting.AspNet
  • Microsoft.Scripting.Metadata

对于第一个例子,我们调用一个 Python 脚本,它将简单地打印出 “Hello World!”。在控制台上。为了保持它尽可能简单,我们只需将 Python 代码硬编码到一个字符串中,然后使用 CreateScriptSourceFromString 从中创建 Microsoft.Scripting.Hosting.ScriptSource 实例。正如你所看到的,这很容易做,只需要3行代码。

static void Main(string[] args)
{
    var pythonEngin = IronPython.Hosting.Python.CreateEngine();
    var pythonScripts = pythonEngin.CreateScriptSourceFromString("print'hello world'");
    pythonScripts.Execute();
}

控制台输出

hello world

如果你想了解更多关于在幕后发生的事情,你可以看看 IronPython Internals Foundations tutorial.

第二个例子

第二个例子与第一个例子几乎相同,但是我们将使用 CreateScriptSourceFromFile 函数从文件中加载脚本,而不是将其硬编码到一个字符串中。由于我们将脚本放在与 Program.cs 文件相同的目录中,我们需要当从 Visual Studio 执行程序时,会出现两个目录。这就是为什么我们脚本的路径是..  ..  HelloWorld.py。您当然可以将脚本放在与可执行文件相同的目录中。代码如下所示。执行程序时,输出当然与前面的示例相同。
完整的例子可以从我们的gitHub仓库获得:IronPythonTutorials/CSharpIntegration/PythonScriptExecution2。

print('Hello World')
static void Main(string[] args)
{
    var pythonEngin = IronPython.Hosting.Python.CreateEngine();
    var pythonScripts = pythonEngin.CreateScriptSourceFromFile("..\\.\\HelloWorld.py"));
    pythonScripts.Execute();
    Console.ReadKey();
}

搜索路径

通常,Python 脚本将依赖于某个模块,或者是一个自定义模块或 Python 标准库中的模块。我们将展示如何使用标准库,但是考虑到大量的模块,我们将从一个更基本的例子开始。
处理模块的唯一困难是设置引擎将查找模块的路径列表。该ScriptEngine的类提供了一个函数来检索的搜索路径当前列表:GetSearchPaths,另一个设置列表:SetSearchPaths。SetSearchPaths 替换现有的列表,所以如果你想添加一个搜索路径,你将需要首先获取当前列表,添加新的路径,然后将更新的列表传递给 SetSearchPaths 函数。
我们来举例说明一个简单的例子。我们修改之前的的一个示例,以便在 HelloWorld.py 导入另一个名为 HelloWorldModule.py 的模块。我们把这两个文件放在与Program.cs相同的目录下。这两个文件的来源如下所示。
完整的例子可以从我们的GitHub仓库获得:IronPythonTutorials/CSharpIntegration/PythonScriptExecution3。

HelloWorldModule.py

def PrintHelloWorld():
    print("Hello World")

HelloWorld.py

import HelloWorldModule

HelloWorldModule.PrintHelloWorld()
static void Main(string[] args)
{
    var pythonEngin = IronPython.Hosting.Python.CreateEngine();
    Console.WriteLine("Search Paths:");
    var searchPaths = pythonEngin.GetSearchPaths();
    foreach (var item in searchPaths)
    {
        Console.WriteLine(item);
    }
    Console.WriteLine();
    searchPaths.Add("..\\..");
    pythonEngin.SetSearchPaths(searchPaths);

    var pythonScript = pythonEngin.CreateScriptSourceFromFile("..\\..\\HelloWorld.py");
    pythonScript.Execute();
}

显然,这是一个稍微做作的例子,因为你通常会把脚本放在一个更合理的位置,但是你应该明白这个想法。
如果一切正常,你应该得到以下输出。

Search Paths:
.
C:\Users\hippieZhou\Documents\Projects\IronPythonTutorials\03_PythonScriptExecution3\bin\Debug\Lib
C:\Users\hippieZhou\Documents\Projects\IronPythonTutorials\03_PythonScriptExecution3\bin\Debug\DLLs

Hello World

但是,如果由于某种原因无法找到一个模块,你会得到下面的异常抛出。

Unhandled Exception: IronPython.Runtime.Exceptions.ImportException: No module na
med os
   at Microsoft.Scripting.Runtime.LightExceptions.CheckAndThrow(Object value)
   at Microsoft.Scripting.Interpreter.FuncCallInstruction`2.Run(InterpretedFrame
 frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run1[T0,TRet](T0 arg0)
   at IronPython.Compiler.RuntimeScriptCode.InvokeTarget(Scope scope)
   at IronPython.Compiler.RuntimeScriptCode.Run()
   at Microsoft.Scripting.Hosting.ScriptSource.Execute()
   at PythonScriptExecution3.Program.Main(String[] args) in c:\p4client2\Tutoria
ls\Development\IronPython\Examples\CSharpIntegration\PythonScriptExecution3\Pyth
onScriptExecution3\Program.cs:line 16

让我们仔细看一下搜索路径的初始列表。
默认情况下,当前工作目录将包含在搜索路径列表中。但是,如果您依赖于此,您的应用程序将会工作与否,具体取决于用户启动应用程序时当前的工作目录。在默认情况下,IronPython 将在搜索路径中包含两条与应用程序本身安装位置相关的路径:在上面的输出中可以看到的Lib和DLL路径。这些位置是将模块与主应用程序保持在一起的好选择。

IronPython 实现使用 Assembly.GetEntryAssembly() 函数来获取主机的路径,以便添加 “Lib” 和 “DLL” 路径。有些情况下,Assembly.GetEntryAssembly()将返回 null,这些路径将不会被添加。一个这样的情况是,当环境是 asp.net

标准库

在您的应用程序中使用标准库并不困难。包含标准库的单独的NuGet包可用。这个包将所有的标准库模块添加到 Visual Studio 项目中。出现的问题是,应用程序使用的模块需要与它分发。如何做到这一点取决于具体情况。在最简单的情况下,您可以将所需的模块放在与应用程序二进制文件相同的目录中,并将它们一起分发。如果您选择该解决方案,则默认搜索路径应该足够,因为它包含“。” 目录。
现在让我们来看一个使用标准库的脚本的简单例子。完整的例子可以从我们的 GitHub 仓库获得:IronPythonTutorials/CSharpIntegration/PythonScriptExecution4。

使用 NuGet 获取 IronPython 标准库:IronPython.StdLib
HelloWorldBase64.py

import base64

originalString = b"Hello World!"
print("OriginalString:" + str(originalString))

encodedString = base64.b64encode(originalString)
print("EncodedString:" + str(encodedString))

decodedString = base64.b64decode(encodedString);
print("Decoded String:" + str(decodedString))

C#

static void Main(string[] args)
{
    var pythonEngin = IronPython.Hosting.Python.CreateEngine();
    Console.WriteLine("Search paths:");
    var searchPaths = pythonEngin.GetSearchPaths();
    foreach (var path in searchPaths)
    {
        Console.WriteLine(path);
    }
    Console.WriteLine();

    searchPaths.Add("..\\..\\Lib");
    pythonEngin.SetSearchPaths(searchPaths);

    var pythonScript = pythonEngin.CreateScriptSourceFromFile("..\\..\\HelloWorldBase64.py");
    pythonScript.Execute();
}

输出

Search paths:
.
C:\Users\hippieZhou\Documents\Projects\IronPythonTutorials\04_PythonScriptExecution4\bin\Debug\Lib
C:\Users\hippieZhou\Documents\Projects\IronPythonTutorials\04_PythonScriptExecution4\bin\Debug\DLLs

OriginalString:Hello World!
EncodedString:SGVsbG8gV29ybGQh
Decoded String:Hello World!

共享变量

在 Microsoft.Scripting.Hosting.ScriptScope 类用于保存的是当前在范围内的变量及其关联值列表。本 ScriptScope 类提供的方法来设置,获取和范围删除变量。他们是 SetVariable, GetVariable 和 RemoveVariable。要获取范围中所有变量的列表,请使用GetVariableNames 方法。
在我们最开始的例子中,我们使用 pythonScript.Execute(); 来运行脚本。无参数 Execute() 函数在 ScriptScope 内部创建实例,因此调用者无法访问它。但是,我们可以使用其他重载来创建 ScriptScope 自己并将其传递给 Execute() 函数。
以下示例显示了如何使用这些函数。完整的例子可以从我们的GitHub仓库获得:IronPythonTutorials/CSharpIntegration/PythonScriptExecution5。

Program.cs

static void Main(string[] args)
{
    var pythonEngin = IronPython.Hosting.Python.CreateEngine();
    var pythonScript = pythonEngin.CreateScriptSourceFromString(
        "helloWorldString='Hello World!'\n" + 
        "print(helloWorldString) \n" + 
        "print(extrnalString)");

    var scope = pythonEngin.CreateScope();
    scope.SetVariable("extrnalString", "How are you.");
    pythonScript.Execute(scope);
    Console.WriteLine();
    Console.WriteLine("List of variables in the scope:");
    foreach (var name in scope.GetVariableNames())
    {
        Console.Write(name+ "   ");
    }
    Console.WriteLine();
    Console.WriteLine("Variable values:");
    Console.WriteLine("helloWorldString:" + scope.GetVariable("helloWorldString"));
    Console.WriteLine("extrnalString:" + scope.GetVariable("extrnalString"));

    Console.ReadKey();
}

输出

Hello World!
How are you.

List of variables in the scope:
extrnalString   __builtins__   __file__   __name__   __doc__   helloWorldString
Variable values:
helloWorldString:Hello World!
extrnalString:How are you.

在这个例子中,脚本定义了这个 helloWorldString 变量,并使用了一个 externalString 在脚本中没有定义的变量 。然后打印这两个变量。
该 externalString 变量显示了C# 代码如何使用该 SetVariable 方法将变量添加到脚本可以使用的范围。
脚本执行后,范围包含由脚本添加的变量列表。C# 代码使用我们前面提到的各种函数来打印执行后的范围内的内容。

导入模块

在本教程前面,我们看到了 Python 脚本如何使用 Python import 语句,只要搜索路径设置正确,就可以像任何常规的 Python 脚本一样使用Python 语句。在这里我们提出另一个有趣的方法,即从 C# 代码中导入模块,而不是 Python 代码。
静态 IronPython.Hosting.Python.ImportModule 函数可以用来导入一个模块。它返回 ScriptScope 包含导入模块中所有变量的类的一个实例。该 ScriptScope 在上面有解释。例如,您可以使用返回的作用域并将其传递给 ScriptSource.Execute 函数,以执行另一个可以使用导入模块的功能的 Python 脚本,甚至可以使用它直接从 C# 执行 Python 方法,如下面的示例所示。
将 ImportModule 搜索路径中的模块作为 Python import 语句进行查找将会这样做,重要的是正确设置路径或找不到模块。
以下示例显示了如何在 Python 模块中定义的函数可以像 C# 函数一样执行。

HelloWorldModule.py

def PrintHelloWorld():
    print("Hello World!")

def PrintMessage(message):
    print(message)

def Add(arg1,arg2):
    return (arg1 + arg2)

Program.cs

static void Main(string[] args)
{
    var pythonEngin = IronPython.Hosting.Python.CreateEngine();
    var searchPaths = pythonEngin.GetSearchPaths();
    searchPaths.Add("..\\..");
    pythonEngin.SetSearchPaths(searchPaths);

    var scope = IronPython.Hosting.Python.ImportModule(pythonEngin, "HelloWorldModule");

    dynamic printHelloWorldFunction = scope.GetVariable("PrintHelloWorld");
    printHelloWorldFunction();

    dynamic printMessageFunction = scope.GetVariable("PrintMessage");
    printMessageFunction("GoodBye!");

    dynamic addFunction = scope.GetVariable("Add");
    Console.WriteLine("The sum of 1 and 2 is " + addFunction(1,2));

    Console.ReadKey();
        }

总结

官网给的示例教程是 Visual Studio 2013 + python 2.x 版本的,对于 Visual Studio 2017 + Python 3.X 版本的使用方式影响不大。按照官网描述一步一步还是可以完成整个的基本教程。
个人理解:IronPython 其实就是相当于将 Python 编译成字节码,然后通过 IronPython 创建的虚拟 Python 运行环境(类似虚拟机)从而达到能够运行 Python 的目的。经过个人(不科学的)测试,这种模式的运行效率并不是很高,在 Python 慢的基础上还要慢一个节拍。所以,想在生产环境中使用的话需要慎重考虑。

参考

  1. IronPython C# Integration

--结束END--

本文标题: IronPython初体验

本文链接: https://www.lsjlt.com/news/180132.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • IronPython初体验
    介绍 在 C# 程序中嵌入 IronPython 得到了很好的支持。在本教程中,我们将展示如何完成这个项目。 首先,我们将展示两个非常基本的例子,说明如何执行一个不导入任何模块的非常简单的脚本。然后,再展示如何执行使用模块的脚本。 在 C...
    99+
    2023-01-30
    初体验 IronPython
  • JetBrainsFleet初体验
    几天前获得了fleet的体验资格。长话短说,今天就来和你一起看看现在的fleet都有啥 先看名字–fleet 什么是fleet? n. 舰队;捕鱼船队;(一国的)全部军舰,海军 看来...
    99+
    2024-04-02
  • Python 初体验
    广告:欢迎大家到 路飞学城 学习 Python~ 很喜欢 Python “薪”时代 这个词~所以我们要拥抱 “人工智能”~拥抱 “Python~” 前提:下载 Python,如果是 Mac 电脑会自带 Python。 Hello Worl...
    99+
    2023-01-31
    初体验 Python
  • Egret3D之初体验
    Ⅰ,Egret3D官方文档 : https://developer.egret.com/cn/docs/3d/docs/guide/getting-started-introduction/ Ⅱ,安装3D编辑器(以前叫paper , 现在...
    99+
    2023-01-31
    之初 Egret3D
  • Service Mesh 初体验
    前言计算机软件技术发展到现在,软件架构的演进无不朝着让开发者能够更加轻松快捷地构建大型复杂应用的方向发展。容器技术最初是为了解决运行环境的不一致问题而产生的,随着不断地发展,围绕容器技术衍生出来越来越多的新方向。最近几年,云计算领域不断地出...
    99+
    2023-06-05
  • springcloud初体验(真香)
    一、微服务简介 Ⅰ、我对微服务的理解 微服务是软件开发的一种架构方式,由单一的应用小程序构成的小服务;一个软件系统由多个服务组成;在微服务中,服务是细粒度的,协议是轻量级的(部...
    99+
    2024-04-02
  • Oracle 18c安装初体验
    Oracle 18c在万众期待下终于开放下载了,目前提供Linux x86-64、Solaris(SPARC)、Solaris(x86-64)三个平台的下载: 安装包也是水涨船高,Linux版...
    99+
    2024-04-02
  • Java开发 - Redis初体验
    前言 es我们已经在前文中有所了解,和es有相似功能的是Redis,他们都不是纯粹的数据库。两者使用场景也是存在一定的差异的,本文目的并不重点说明他们之间的差异,但会简要说明,重点还是在对Redis的了解和学习上。学完本篇,你将了解Redi...
    99+
    2023-09-08
    redis 数据库 redis实战 缓存预热 微服务
  • Java开发 - Quartz初体验
    目录​​​​​​​ 前言 Quartz 什么是Quartz Quartz作用 Quartz结构 表达式 案例 Quartz实战 添加依赖 创建Job类 创建配置类 测试代码 扩展练习 结语 前言 在上一篇博客中,我们对单点登录有了初步了...
    99+
    2023-09-07
    Quart 任务调度 scheduling Job JobDetail
  • 初探oVirt-体验sdk-python
    日期:2015/10/20 - 2015/12/8 time 16:09主机:n86目的:初探oVirt-体验sdk-python操作内容: 一、说明 使用sdk-python 通过pip安装 ovirt-engine-sdk-python...
    99+
    2023-01-31
    oVirt sdk python
  • Java开发 - SpringCache初体验
    前言 早些时候,博主介绍过Redis的使用:Java开发 - Redis初体验,Redie是基于缓存的一项技术,对于Redis,博主此处不再赘述,不了解的可以去看这篇文章,但Redis缓存并不是顶峰,本文要讲的内容就是Redis的辅助工具:...
    99+
    2023-09-05
    Redis SpringCache 缓存 CacheManager Cacheable
  • Java开发 - Elasticsearch初体验
    目录 前言 什么是es? 为什么要使用es? es查询的原理? es需要准备什么?  es基本用法 创建工程 添加依赖 创建操作es的文件 使用ik分词插件 Spring Data 项目中引入Spring Data 添加依赖 添加配置 创建...
    99+
    2023-09-05
    elasticsearch 大数据 搜索引擎 es 微服务
  • React-three-fiber使用初体验
    目录React-three-fiber引入canvasuseFrameLightscamera设置React-three-fiber npm init -y npm install ...
    99+
    2023-05-19
    React-three-fiber使用 React-three-fiber初体验
  • javascriptThree.js创建文字初体验
    目录效果开始创建文本首先创建字体加载器加载字体库创建文字几何体计算文字几何体外边界矩形创建镜像文字创建半透明平面渲染关于文本构造器参数当curveSegments设置越低时,可以看到...
    99+
    2024-04-02
  • Exchange 2007使用初体验(3
    大家可以看到,在Exchange 2007中,邮箱的种类多了很多,在这里我们只是选择默认的“用户邮箱”,然后点“下一步”: 功能虽然一样,但界面明显比在“AD用户和计算机”中更加的漂亮和合理。填写好相应的信息以后,点“下一...
    99+
    2023-01-31
    初体验 Exchange
  • 初体验阿里云ECS使用
    随着互联网技术的发展,越来越多的企业和个人开始使用云计算服务,阿里云ECS(Elastic ComputeService)就是其中之一。阿里云ECS提供了一种弹性扩展的计算服务,可以根据业务需求动态调整资源,提高计算效率,降低成本。本文将...
    99+
    2023-10-30
    阿里 初体验 ECS
  • Windows Phone开发工具初体验
    Windows Phone开发工具是一套用于开发Windows Phone应用程序的集成开发环境。以下是我对该工具的初步体验:1. ...
    99+
    2023-09-08
    Windows
  • java Spring Boot的介绍与初体验
    目录Spring Boot 介绍系统要求构建工具Servlet 容器初体验总结Spring Boot 介绍 Spring Boot用于创建可运行的、独立的、生产级的基于Spring的...
    99+
    2024-04-02
  • 初次体验MyBatis的注意事项
    一、MyBatis的HelloWord 1.根据xml配置文件(全局配置文件mybatis-config.xml)创建一个SqlSessionFactory对象 有数据源一些运行环境...
    99+
    2024-04-02
  • Avue 组件库的使用初体验
    目录1. 使用的初体验2. 不好的地方 1. 使用的初体验 今天给大家讲一下我最近发现的比较冷门的一个组件库,但是功能还是蛮多,这里就给大家介绍一下 , 网址也给大家放在这里 &nb...
    99+
    2022-11-13
    Avue 组件库 Avue 组件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作