.NET 4.0 下使用 Python for .NET

前两天,有个项目需要从 Python 里访问 .NET。于是我搜索了一下网络,发现有两个项目与此相关: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 : 适合大部分程序都是在 CPython 中运行的,只是在一小部分程序中需要访问 .NET 的功能。比如在一个 Python 系统中调用一个 .NET 实现的库;
  • IronPython :适合熟悉 Python 语言,希望开发 .NET 库或者利用 .NET 库的开发者。比如想用 Python 语法来开发基于 WPF 的应用程序。

根据我的需求,我决定使用 Python for .NET。要使用 Python for .NET,最重要的是两个组件:

  1. Python.Runtime.dll :这是一个用 C# 编写的 .NET 程序集,和 CLR 类似,像个 .NET 虚拟机,提供访问 .NET 世界的功能;
  2. clr.pyd : 这是一个 Python 模块文件,它连接 CPython 和 Python.Runtime.dll,起着桥梁的作用。

由于 .NET 平台和 Python 平台的版本众多,为避免编译出过多的版本组合,所以 Python for .NET 采用源代码形式进行发布。因此,要使用源代码,我们需要首先确定两件事情:

  1. 我们的目标 .NET 平台版本?当然,眼下最 IN 的要算是 VS2010 + .NET 4.0 组合啦;
  2. 我们的目标 CPython 版本?当前,Python for .NET 支持的 CPython 版本是从 2.3 到 2.7。

确定好版本后,作为源代码发布,当然要获得源代码。通过 Python for .NET 的 SourceForge 页面我们可以获得如何连接 SVN 的说明。或者我们可以直接从如下 URL 导出源代码:

https://pythonnet.svn.sourceforge.net/svnroot/pythonnet/trunk

该源代码里包含了一个用 VS2008 创建的解决方案,我们完全可以用 VS2010 对其进行转换,不会产生转换错误。

用 VS2010 打开项目后,依照如下步骤设置相应的 .NET 和 CPython 版本:

  1. 改变目标 .NET 版本:在项目“Python.Runtime”上右击鼠标,选择“Properties”, 然后选择“Application”标签,将“Target framework”设置为“.NET Framework 4”;
  2. 修改 buildclrmodule.bat 文件(注意,有两处!):
    %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%
  3. 修改 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
  4. 修改 CPython 版本:右键点击“Python.Runtime”项目,选择“Properties”,在“Build”标签下的“Conditional compilation symbols”设置,将默认的“PYTHON26”改变为我们想使用的“PYTHON27”;
  5. 最后,对“Python.Runtime”项目进行重新编译即可。

编译后,你就会得到 Python.Runtime.dll 和 clr.pyd 这两个文件。将这两个文件拷贝到任意位置,然后创建测试用的 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") 来载入该程序集,然后你就可以使用其中的类和方法了。


你可能感兴趣的:(.NET 4.0 下使用 Python for .NET)