我想学习 Python,但我作为 C# 开发人员整天在 .Net 中工作,所以我决定下载并安装 IronPython 和集成的 IronPython 工作室。它与原始 Python 有何不同或相似之处?作为 .Net 开发人员,我可以期望在 .Net 环境中毫无问题地运行传统的 Python 脚本,或者这只是旧的迁移乌托邦吗?我能期待什么?
提前致谢。
编辑:迪克。2009 - IronPython 最近升级到 2.6。如果可能,请升级您的答案。
我想学习 Python,但我作为 C# 开发人员整天在 .Net 中工作,所以我决定下载并安装 IronPython 和集成的 IronPython 工作室。它与原始 Python 有何不同或相似之处?作为 .Net 开发人员,我可以期望在 .Net 环境中毫无问题地运行传统的 Python 脚本,或者这只是旧的迁移乌托邦吗?我能期待什么?
提前致谢。
编辑:迪克。2009 - IronPython 最近升级到 2.6。如果可能,请升级您的答案。
在您的情况下,学习 IronPython 是完全合理的(尤其是这本书可以很好地帮助您做到这一点!)。您将可以访问基本上所有 Python 2.5 功能(不确定 IronPython 何时会升级到 Python 的 2.6 版本,但 2.5 已经相当可用),以及您知道和喜爱的所有 .Net 库和程序集,以及诸如此类的工具作为 Visual Studio 加载项。
CPython 和 IronPython(以及 Jython,就此而言,它将与 IronPython 相同的概念应用于 JVM ——Jim Hugunin 早在他移居微软并创立 IronPython 之前,他就是 Jython 的创始人,这两个项目现在都蓬勃发展)之间的区别是主要用于垃圾收集和线程:IronPython 和 Jython 依赖于它们的底层平台(因此,您可以获得标记和清除垃圾收集和自由线程),CPython 自己滚动(因此,它主要是引用计数 GC,带有标记和- 偶尔扫描以解决引用循环,以及受全局解释器锁阻碍的线程)。
一个编码良好的 Python 脚本不依赖于相关的实现细节(它从不假设 GC 立即发生,从不假设一个操作在线程下是原子的,除了少数几个,比如 Queue.Queue 的方法,它们被明确记录为),但当然有很多草率的脚本。例如:
data = open('x.txt').read()
这会使文件对象保持打开状态,直到它被垃圾收集;在引用计数环境中,收集立即发生(因此文件被尽快关闭),在标记和清除环境中并非如此(因此使用此类构造的过程通常会错误地保留一些文件,可能是很多文件,无用的打开时间比他们需要的时间长得多,浪费系统资源 &c)。
因此,正确的Python 编码是:
# needed in 2.5, unneeded but innocuous in 2.6
from __future__ import with_statement
with open('x.txt') as f: data = f.read()
这确实保证了在每个实现中立即关闭文件(该with
语句非常方便;-)。
这不会影响你对 Python 的学习,也不会阻碍正确编码的 Python 代码的重用,但是如果你想重用编码草率的 Python 代码(尤其是在长时间运行的服务器、服务、守护进程等) ) 您将来可能需要对其进行一些收紧。所以,顺便说一句,想要使用更新更好的 CPython 版本的人,比如 Unladen Swallow &c,一旦这些版本实现了更好的垃圾收集机制,摆脱 GIL 和其他增强功能;希望这已经将 Python 社区的“文化”改变为更正确、更少草率的编码,但当然周围有无数行旧的草率代码,所以需要注意;-)。
大多数 python 脚本在 IronPython 中运行良好。
这是最新版本中 IronPython 中未包含的包和模块的列表。
只要您的脚本不依赖这些,它很可能无需更改即可工作。然而,IronPython 的大部分“力量”通过迁移脚本以使用 .NET 框架类而不是 python 标准库来真正发挥作用。