c#调用python模块_C#调用Python脚本并使用Python的第三方模块

前言

InronPython是一种在.NET和Mono上实现的Python语言,使用InronPython就可以在.NET环境中调用Python代码,非常方便。

本文主要介绍在C#中调用Python代码,并使用Python安装的第三方模块。

安装InronPython

要在.NET环境中使用Python,先要安装InronPython(当然也要安装Python),安装很简单,直接下载安装就行。在CodePlex就有下载,下载地址:

使用

添加引用库

在Visual Studio新建一个工程后,添加引用IronPython.dll和Microsoft.Scripting.dll(位于InronPython的安装目录下,如下图)。

C#代码内嵌Python

最简单的使用方式如下:var engine = IronPython.Hosting.Python.CreateEngine();

engine.CreateScriptSourceFromString("print 'hello world!'").Execute();

从文件中加载Python代码

一般情况下我们还是要把Python代码单独写在文件中。在工程中新建一个Python文件,如 hello.py ,并设置其属性Copy to Output Directory的值为Copy if newer。在hello.py下编写如下代码:def say_hello():

print "hello!"

def get_text():

return "text from hello.py"

def add(arg1, arg2):

return arg1 + arg2

C#代码如下:var engine = IronPython.Hosting.Python.CreateEngine();

var scope = engine.CreateScope();

var source = engine.CreateScriptSourceFromFile("hello.py");

source.Execute(scope);

var say_hello = scope.GetVariable>("say_hello");

say_hello();

var get_text = scope.GetVariable>("get_text");

var text = get_text().ToString();

Console.WriteLine(text);

var add = scope.GetVariable>("add");

var result1 = add(1, 2);

Console.WriteLine(result1);

var result2 = add("hello ", "world");

Console.WriteLine(result2);

更详细的使用方法可参考 文档 和 代码例子 。

使用Python安装的第三模块

问题

到此为止,程序运行得很顺利。可是好景不长,最近用Python写了个程序要使用rsa加密,在Python中安装了rsa模块(下载地址: https://pypi.python.org/pypi/rsa/3.1.1 )后,直接运行Python代码没问题,可是在C#代码调用时就报异常,异常信息如下:An unhandled exception of type 'IronPython.Runtime.Exceptions.ImportException' occurred in Microsoft.Dynamic.dll

Additional information: No module named rsa

没有找到模块,经过一番google,说是要设置 sys.path ,如下:import sys

sys.path.append(r"c:\python27\lib")

照做之后问题依旧。不过想一想,应该是sys.path还没设置对。

解决

先在python代码加上下面几行:import sys

sys.path.append(r"c:\python27\lib")

print sys.path

运行查看输出,在对比Python环境下的 sys.path ,果然不一样,问题应该就出在 sys.path 上了。

在cmd下分别打开python和IronPython(在IronPython安装目录下的ipy64.exe或ipy.exe),执行 import sys;print sys.path ,对比输出:

python:['', 'C:\\Python27\\lib\\site-packages\\setuptools-12.0.3-py2.7.egg', 'C:\\Pytho

n27\\lib\\site-packages\\rsa-3.1.1-py2.7.egg', 'C:\\Python27\\lib\\site-packages

\\pyasn1-0.1.7-py2.7.egg', 'C:\\Windows\\SYSTEM32\\python27.zip', 'C:\\Python27\

\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\

lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages']

IronPython:['.', 'C:\\Program Files (x86)\\IronPython 2.7\\Lib', 'C:\\Program Files (x86)\\

IronPython 2.7\\DLLs', 'C:\\Program Files (x86)\\IronPython 2.7', 'C:\\Program F

iles (x86)\\IronPython 2.7\\lib\\site-packages']

分别在两个环境在执行 import rsa ,Python环境正常,IronPython环境下报ImportError: No module named rsa异常。在IronPython环境下执行如下操作:sys.path.append('C:\\Python27\\lib\\site-packages\\setuptools-12.0.3-py2.7.egg')

sys.path.append('C:\\Python27\\lib\\site-packages\\rsa-3.1.1-py2.7.egg')

再次 import rsa ,不报异常了。

对应的python代码文件加上如下几行:import sys

sys.path.append('C:\\Python27\\lib')

sys.path.append('C:\\Python27\\lib\\site-packages\\setuptools-12.0.3-py2.7.egg')

sys.path.append('C:\\Python27\\lib\\site-packages\\rsa-3.1.1-py2.7.egg')

import rsa

再次运行,Ok!

java调用python脚本并向python脚本传递参数

1.安装Eclipse 先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成 ...

Zabbix调用外部脚本发送邮件:python编写脚本

Zabbix调用外部脚本发送邮件的时候,会在命令行传入两个参数,第一个参数就是要发送给哪个邮箱地址,第二个参数就是邮件信息,为了保证可以传入多个参数,所以假设有多个参数传入 #!/usr/bin/en ...

如何在Windows下开发Python:在cmd下运行Python脚本+如何使用Python Shell(command line模式和GUI模式)+如何使用Python IDE

http://www.crifan.com/how_to_do_python_development_under_windows_environment/ 本文目的 希望对于,如何在Windows下, ...

在Python脚本中判断Python的版本

引自:http://segmentfault.com/q/1010000000127878 如果是给人读,用 sys.version,如果是给机器比较,用 sys.version_info,如果是判断 ...

python脚本传入参数--精讲(getopt模块)

1.最常用的sys.argv[],这个不多谈 2.形如 dahu@dahu-OptiPlex-:~/json_folder$ python sub1.py -abb -oaaa --output=ou ...

在cmd下运行Python脚本+如何使用Python Shell

原文:https://blog.csdn.net/flyfrommath/article/details/77447587?locationNum=2&fps=1

使用pyinstaller打包python小程序(没有使用第三方模块)

准备: 1,xxx.py程序文件 2,自定义的图标文件:xxx.ico 图标文件应该包含常见的多分辨率格式,以便适应在不同场合显示,不能是单一图片. 你可以用专用的软件处理生成图标,不过少量的图标生产 ...

[Java/Python] java调用python脚本问题记录

Java调用Python的的两种方式 1.Runtime private static String call_python(String input_argv) { String python_py ...

Python 调用 Shell脚本的方法

Python 调用 Shell脚本的方法 1.os模块的popen方法 通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出. > ...

随机推荐

[LeetCode] Valid Perfect Square 检验完全平方数

Given a positive integer num, write a function which returns True if num is a perfect square else Fa ...

c查漏补缺

restrict 要理解什么是restrict,首先要知道Pointer aliasing:指两个或以上的指针指向同一数据,例如: ; int *a = &i; int *b = &i ...

神奇的NOIP模拟赛 T2 LGTB 学分块

LGTB 学分块 LGTB 最近在学分块,但是他太菜了,分的块数量太多他就混乱了,所以只能分成3 块今天他得到了一个数组,他突然也想把它分块,他想知道,把这个数组分成3 块,块可以为空.假设3 块各自 ...

封装底层Ajax

创建Ajax简易步骤:创建Ajax对象:var xhr=new XMLHttpRequest();链接服务器:xhr.open('get','a.php',true);发送请求或数据:xhr.send ...

android学习日记20--连接组件之Intent和IntentFilter

上次刚了解完Android的四大组件,现在学习组件间通信的Intent和IntentFilter 一.Intent 1.简述 Intent(意图)在应用程序运行时连接两个不同组件,是一种运行时的绑定机 ...

cas+tomcat+shiro实现单点登录-1-tomcat添加https协议

目录 1.tomcat添加https安全协议 2.下载cas server端部署到tomcat上 3.CAS服务器深入配置(连接MYSQL) 4.Apache Shiro 集成Cas作为cas cli ...

markdown 书写代码

近期基于github + hexo 搭建了自己的博客.開始用markdown写博客,推荐 mac 平台用 mou 这个软件或者 vim. 介绍下markdown语法插入代码的规则: 有一种方法是全部代 ...

ios 面试题 0

1.__block和__weak修饰符的区别:  1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型.  2.__weak只能在ARC模式下使用,也只能修饰 ...

[翻译] .NET Core 2.1 Preview 1 发布

[翻译] .NET Core 2.1 Preview 1 发布 原文: Announcing .NET Core 2.1 Preview 1 今天,我们宣布发布 .NET Core 2.1 Previ ...

HTTP的长连接,你不知道的连接。。。

长连接起源 什么样的连接才能称之为长连接?要多长.... http是一种无状态的协议,也就是stateless协议,而http协议又是建立在tcp/ip协议的基础之上的. 无状态表示每次请求都是一次独 ...

你可能感兴趣的:(c#调用python模块)