首先,我要搞清楚Python for .NET ,IronPython 它们之间的区别。
Python 作为一门语言,其解释器(因为是解释型动态语言,所以我觉得称之为解释器 interpreter 比编译器 compiler 更合适)并不是只有唯一实现的。通常我们从 Python 官方网站下载的 Python 解释器其实只是一种用纯 C 语言的实现,大家习惯称之为 CPython。而目前流行的还有另外两种解释器: Jython 和 IronPython。前者是 Python 语言的 Java 实现;而后者则是 Python 语言的 .NET 解释器实现。IronPython 最终生成的是 .NET 的 IL 语言,所以和 .NET 相关很紧密;而 Python for .NET 则是在原有的 CPython 上的一个扩充,利用 CLR 的功能来访问 .NET 的平台和类库。总得来说:
根据我的需求,我决定使用 Python for .NET。要使用 Python for .NET,最重要的是两个组件:
由于 .NET 平台和 Python 平台的版本众多,为避免编译出过多的版本组合,所以 Python for .NET 采用源代码形式进行发布。因此,要使用源代码,我们需要首先确定两件事情:
确定好版本后,作为源代码发布,当然要获得源代码。通过 Python for .NET 的 SourceForge 页面我们可以获得如何连接 SVN 的说明。或者我们可以直接从如下 URL 导出源代码:
https://pythonnet.svn.sourceforge.net/svnroot/pythonnet/trunk
该源代码里包含了一个用 VS2008 创建的解决方案,我们完全可以用 VS2010 对其进行转换,不会产生转换错误。
用 VS2010 打开项目后,依照如下步骤设置相应的 .NET 和 CPython 版本:
%windir%\Microsoft.NET\Framework\v2.0.50727\ilasm /nologo /quiet /dll %ILASM_EXTRA_ARGS% /include=%INCLUDE_PATH% /output=%OUTPUT_PATH% %INPUT_PATH%
%windir%\Microsoft.NET\Framework\v4.0.30319\ilasm /nologo /quiet /dll %ILASM_EXTRA_ARGS% /include=%INCLUDE_PATH% /output=%OUTPUT_PATH% %INPUT_PATH%
clrmodule.il
文件,主要是修改其饮用的 mscorlib 版本:.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 2:0:0:0
}
.ver 4:0:0:0
编译后,你就会得到 Python.Runtime.dll 和 clr.pyd 这两个文件。将这两个文件拷贝到任意位置(如果想在任何位置都可以使用,最好把这两个文件放在python 的sys.path 目录下,比如DLLs),然后创建测试用的 Python 脚本:
import clr import sys import System print System.Environment.Version # you can also print out the sys.path print '-----' for p in sys.path: print p print '-----'
要使用你自己开发的私有程序集,则需要先用 clr.AddReference()
函数对你的程序集进行引用。例如,你有一个名为”Test.dll“的程序集,你则需要先执行clr.AddReference("Test")
来载入该程序集,然后你就可以使用其中的类和方法了。