当前位置:  开发笔记 > 编程语言 > 正文

从CPython迁移到Jython

如何解决《从CPython迁移到Jython》经验,为你挑选了3个好方法。

我正在考虑将我的代码(大约30K LOC)从CPython移动到Jython,这样我就可以更好地与我的java代码集成.

是否有我应该查看的清单或指南,以帮助我进行迁移?做有类似事情的人有经验吗?

从阅读Jython网站开始,大多数问题都显得过于模糊,无法打扰我.

我注意到:

线程安全是一个问题

Unicode支持似乎完全不同,这对我来说可能是一个问题

mysqldb不起作用,需要用zxJDBC替换

还要别的吗?

相关问题:编写在CPython,Jython和IronPython中运行的python代码有哪些策略



1> Frederik..:

首先,我不得不说Jython实现非常好.大多数事情"只是工作".

以下是我遇到的一些事情:

当然,C模块不可用.

open('file').read()不会自动关闭文件.这与垃圾收集器的区别有关.这可能会导致打开文件过多而导致问题.最好使用"with open('file')作为fp"成语.

设置当前工作目录(使用os.setcwd())适用于Python代码,但不适用于Java代码.它模拟了与文件相关的所有内容的当前工作目录,但只能为Jython执行此操作.

XML解析将尝试验证外部DTD是否可用.这会导致XML处理代码大量减速,因为解析器将通过网络下载DTD.我报告了这个问题,但到目前为止它还没有解决.

__ del __方法在Jython代码中很晚才被调用,而不是在删除对象的最后一次引用之后立即调用.

有一个旧的差异列表,但最近的列表不可用.


关于`__del__`方法:规范实际上没有定义何时应该调用该方法,所以你根本不应该在代码中依赖它.(我相信在某处的Python文档中有关于此的通知.)

2> Ali Afshar..:

到目前为止,我注意到另外两个问题:

字符串实习'a'是'a'不能得到保证(它只是CPython上的一个实现侥幸).这可能是一个严重的问题,而且实际上是我移植的一个库(Jinja2).单元测试(一如既往)是你最好的朋友!

Jython 2.5b0 (trunk:5540, Oct 31 2008, 13:55:41)
>>> 'a' is 'a'
True
>>> s = 'a'
>>> 'a' is s
False
>>> 'a' == s   
True
>>> intern('a') is intern(s)
True

这是CPython上的同一个会话:

Python 2.5.2 (r252:60911, Oct  5 2008, 19:24:49)
>>> 'a' is 'a'
True
>>> s = 'a'
>>> 'a' is s
True
>>> 'a' == s
True
>>> intern('a') is intern(s)
True

os.spawn*函数未实现.而是使用subprocess.call.我真的很惊讶,因为使用subprocess.call的实现很简单,我相信他们会接受补丁.

(我最近做过类似的事情,最近移植了一个应用程序)


据我所知,"is"必须用于检查对象是否存储在内存中的相同位置.使用"是"而不是"=="是坏习惯.

3> itsadok..:

我是从其他答案和我的经验中收集的维基开始的.随意编辑和添加内容,但请尽量坚持实用的建议,而不是一堆破碎的东西.这是与Jython网站不同的旧列表.

资源管理

Jython不使用引用计数,因此资源被释放,因为它们是垃圾收集的,这比你在等效的CPython程序中看到的要晚得多

open('file').read()不会自动关闭文件.更好地使用with open('file') as fp成语.

__ del __方法在Jython代码中很晚才被调用,而不是在删除对象的最后一次引用之后立即调用.

MySQL集成

mysqldb是交流模块,因此无法在jython中使用.相反,你应该使用com.ziclix.python.sql.zxJDBC,与Jython捆绑在一起.

替换以下MySQLdb代码:

connection = MySQLdb.connect(host, user, passwd, db, use_unicode=True, chatset='utf8')

附:

url = "jdbc:mysql://%s/%s?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" % (host, db)
connections = zxJDBC.connect(url, user, passwd, "com.mysql.jdbc.Driver")

您还需要更换所有_mysql_exceptionzxJDBC.

最后,您需要将查询占位符替换%s?.

统一

你不能在Jython中表达非法的unicode字符.尝试类似的东西unichr(0xd800)会导致异常,并且u'\ud800' 在代码中使用文字只会造成严重破坏.

遗失的东西

当然,C模块不可用.

所以没有NumPy或SciPy.

os.spawn*函数未实现.而是使用subprocess.call.

性能

对于大多数工作负载,Jython将比CPython慢​​得多.报告的速度要慢3到50倍.

社区

Jython项目仍然存在,但不是快速移动.在 开发邮件列表 有一个每月20消息,并且似乎有大约只有2开发人员commiting码最近.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有