我正在考虑将我的代码(大约30K LOC)从CPython移动到Jython,这样我就可以更好地与我的java代码集成.
是否有我应该查看的清单或指南,以帮助我进行迁移?做有类似事情的人有经验吗?
从阅读Jython网站开始,大多数问题都显得过于模糊,无法打扰我.
我注意到:
线程安全是一个问题
Unicode支持似乎完全不同,这对我来说可能是一个问题
mysqldb不起作用,需要用zxJDBC替换
还要别的吗?
相关问题:编写在CPython,Jython和IronPython中运行的python代码有哪些策略
首先,我不得不说Jython实现非常好.大多数事情"只是工作".
以下是我遇到的一些事情:
当然,C模块不可用.
open('file').read()不会自动关闭文件.这与垃圾收集器的区别有关.这可能会导致打开文件过多而导致问题.最好使用"with open('file')作为fp"成语.
设置当前工作目录(使用os.setcwd())适用于Python代码,但不适用于Java代码.它模拟了与文件相关的所有内容的当前工作目录,但只能为Jython执行此操作.
XML解析将尝试验证外部DTD是否可用.这会导致XML处理代码大量减速,因为解析器将通过网络下载DTD.我报告了这个问题,但到目前为止它还没有解决.
__ del __方法在Jython代码中很晚才被调用,而不是在删除对象的最后一次引用之后立即调用.
有一个旧的差异列表,但最近的列表不可用.
到目前为止,我注意到另外两个问题:
字符串实习'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的实现很简单,我相信他们会接受补丁.
(我最近做过类似的事情,最近移植了一个应用程序)
我是从其他答案和我的经验中收集的维基开始的.随意编辑和添加内容,但请尽量坚持实用的建议,而不是一堆破碎的东西.这是与Jython网站不同的旧列表.
Jython不使用引用计数,因此资源被释放,因为它们是垃圾收集的,这比你在等效的CPython程序中看到的要晚得多
open('file').read()
不会自动关闭文件.更好地使用with open('file') as fp
成语.
__ del __方法在Jython代码中很晚才被调用,而不是在删除对象的最后一次引用之后立即调用.
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_exception
有zxJDBC
.
最后,您需要将查询占位符替换%s
为?
.
你不能在Jython中表达非法的unicode字符.尝试类似的东西unichr(0xd800)
会导致异常,并且u'\ud800'
在代码中使用文字只会造成严重破坏.
当然,C模块不可用.
所以没有NumPy或SciPy.
os.spawn*函数未实现.而是使用subprocess.call.
对于大多数工作负载,Jython将比CPython慢得多.报告的速度要慢3到50倍.
Jython项目仍然存在,但不是快速移动.在 开发邮件列表 有一个每月20消息,并且似乎有大约只有2开发人员commiting码最近.