IronPython与原生Python比较。我可以期待从前者得到什么?

5 投票
2 回答
1092 浏览
提问于 2025-04-15 15:32

我想学习Python,但我整天在用C#做.Net开发,所以我决定下载并安装IronPython,还集成了IronPython Studio。请问它和原版Python有多大区别或相似之处?作为一个.Net开发者,我能否在.Net环境中毫无问题地运行普通的Python脚本,还是说这只是一个老掉牙的迁移梦想?我应该期待什么呢?

提前谢谢大家。

补充:2009年12月 - IronPython最近升级到了2.6版本。如果可能的话,请更新你们的回答。

2 个回答

1

大多数Python脚本在IronPython中运行得非常好。

这里有一个不包含在IronPython中的标准库组件和模块的列表,这是最新版本的内容。

只要你的脚本不依赖这些缺失的组件,它很可能可以正常运行而不需要修改。不过,IronPython的真正“强大”之处在于,你可以把脚本迁移到使用.NET框架的类,而不是仅仅使用Python的标准库。

3

在你的情况下,学习IronPython是非常合理的选择(尤其是这本书能很好地帮助你!)。你将能使用几乎所有Python 2.5的功能(不确定IronPython什么时候会升级到2.6版本,但2.5已经相当好用了),而且你还可以使用所有你熟悉的.Net库和组件,以及像Visual Studio这样的工具。

CPython和IronPython(还有Jython,这个也是类似的概念,只不过是针对Java虚拟机的——Jim Hugunin在转到微软之前就创造了Jython,后来他又创造了IronPython,这两个项目现在都发展得很好)之间的主要区别在于垃圾回收和线程处理:IronPython和Jython依赖于它们的底层平台(所以,你会得到标记-清扫的垃圾回收和自由的线程处理),而CPython则是自己实现的(所以,它主要是引用计数的垃圾回收,偶尔会进行标记-清扫来解决引用循环,线程处理受到全局解释器锁的限制)。

一个写得好的Python脚本不依赖于这些实现细节(它从不假设垃圾回收会立即发生,也从不假设在多线程下某个操作是原子的,除了少数几个像Queue.Queue的方法是明确说明的),但当然,外面有很多写得不好的脚本。例如:

data = open('x.txt').read()

这段代码会让文件对象保持打开状态,直到被垃圾回收;在引用计数的环境中,垃圾回收会立即发生(所以文件会尽快关闭),而在标记-清扫的环境中则不是这样(所以使用这种构造的过程可能会错误地让一些文件,甚至很多文件,长时间保持打开状态,浪费系统资源等)。

所以,正确的 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等,一旦这些版本实现了更好的垃圾回收机制,去掉了全局解释器锁,以及其他改进,可能也会面临同样的情况;希望这已经在改变Python社区的“文化”,让大家更注重正确、少一些马虎的编码,但当然,外面还有成千上万行旧的马虎代码,所以还是需要一些小心;-)。

撰写回答