C#调用Python脚本并使用Python的第三方模块
【转载】http://zh.5long.me/2015/dotnet-call-python/
前言
InronPython是一种在.NET和Mono上实现的Python语言,使用InronPython就可以在.NET环境中调用Python代码,非常方便。
本文主要介绍在C#中调用Python代码,并使用Python安装的第三方模块。
安装InronPython
要在.NET环境中使用Python,先要安装InronPython(当然也要安装Python),安装很简单,直接下载安装就行。在CodePlex就有下载,下载地址:
还可以把 Python Tools for Visual Studio 也安装了。
使用
添加引用库
在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<Func<object>>("say_hello");
say_hello();
var get_text = scope.GetVariable<Func<object>>("get_text");
var text = get_text().ToString();
Console.WriteLine(text);
var add = scope.GetVariable<Func<object, object, object>>("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!
C#调用Python脚本并使用Python的第三方模块的更多相关文章
- 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() 的操作可以看到执行的输出. > ...
随机推荐
- PS2018学习笔记(25-29节)
25-亮度与色阶看懂直方图-part1 # 本节知识点: 灰度模式 明暗对比 明度/对比度命令 直方图 色阶命令 调整图层 # 本节段落表: 了解亮度对比 灰度模式观察明暗 明度/对比度命令 认知对比 ...
- jQuery点击弹出层,弹出模态框,点击模态框消失
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- windows系统下python2.7.14版本的安装
[前言] 本文主要对window下如何安装Python进行图解说明. [正文] 步骤一 从官网下载相应的版本(本文以2.7.14为例),下载地址:https://www.python.org/down ...
- PowerDesigner如何将字段的注释显示出来
选定一个编辑的表,右键- >Properties- >Columns- >Customize Columns and Filter(或直接用快捷键Ctrl+U)- >Comme ...
- Codeforces 1161B(判断旋转对称)
要点 外层暴力枚举转的"角度",会发现肯定是n的约数 对于m条线段想判定当前的"角度"是否ok,每个线段只要管它自己的下一个即可,不必画个圈遍历一遍 之后将本来 ...
- Phpstorm Git 操作
一.前提: 1.下载并安装好 Phpstorm 2.下载并安装好 Git 3.熟悉 Git 相关命令行操作 二.Git pull & commit(add): 下面简单说一下相关操作: Php ...
- 027 Remove Element 移除元素
给定一个数组和一个值,在这个数组中原地移除指定值和返回移除后新的数组长度.不要为其他数组分配额外空间,你必须使用 O(1) 的额外内存原地修改这个输入数组.元素的顺序可以改变.超过返回的新的数组长度以 ...
- 最小生成树(prim算法和kruskal算法)
学习博客:https://www.cnblogs.com/zhangming-blog/p/5414514.html 其实就是加点法:从不属于这个集合的点中找从本集合可以找到的最小边,加入本集合 看代 ...
- nodejs加密解密
nodejs是通集成在内核中的crypto模块来完成加密解密. 常用加密解密模块化代码: /** * Created by linli on 2015/8/25. */ var crypto = re ...
- 用mvc模式,整理前两次的代码并增加登陆注册
简单的servlet连接mysql数据库 使用mvc的登录注册 commons-dbutils-1.6 mysql-connector-java-5.1.40-bin c3p0-0.9.5.2 mch ...