我正在考虑将我的代码(大约 30K LOC)从 CPython 移动到 Jython,以便我可以更好地与我的 java 代码集成。
是否有我应该查看的清单或指南来帮助我进行迁移?有没有人有做类似事情的经验?
通过阅读Jython 站点,大多数问题似乎都太模糊而无法困扰我。
我确实注意到:
- 线程安全是个问题
- Unicode 支持似乎完全不同,这对我来说可能是个问题
- mysqldb 不行,需要换成zxJDBC
还要别的吗?
我正在考虑将我的代码(大约 30K LOC)从 CPython 移动到 Jython,以便我可以更好地与我的 java 代码集成。
是否有我应该查看的清单或指南来帮助我进行迁移?有没有人有做类似事情的经验?
通过阅读Jython 站点,大多数问题似乎都太模糊而无法困扰我。
我确实注意到:
还要别的吗?
首先,我不得不说 Jython 的实现非常好。大多数事情“正常工作”。
以下是我遇到的一些情况:
当然,C 模块不可用。
open('file').read() 不会自动关闭文件。这与垃圾收集器的差异有关。这可能会导致打开文件过多的问题。最好使用“with open('file') as fp”成语。
设置当前工作目录(使用 os.setcwd())适用于 Python 代码,但不适用于 Java 代码。它模拟所有与文件相关的当前工作目录,但只能为 Jython 这样做。
XML 解析将尝试验证外部 DTD(如果可用)。由于解析器将通过网络下载 DTD,这会导致 XML 处理代码的速度大幅下降。我报告了这个问题,但到目前为止它仍未修复。
__ del __ 方法在 Jython 代码中很晚才被调用,而不是在对对象的最后一个引用被删除之后立即调用。
有一个旧的差异列表,但没有最近的列表。
到目前为止,我注意到了另外两个问题:
Jython 2.5b0(主干:5540,2008 年 10 月 31 日,13:55:41) >>> 'a' 是'a' 真的 >>> s = 'a' >>> 'a' 是 s 错误的 >>> 'a' == s 真的 >>> intern('a') 是实习生 真的
这是关于 CPython 的同一会话:
Python 2.5.2(r252:60911,2008 年 10 月 5 日,19:24:49) >>> 'a' 是'a' 真的 >>> s = 'a' >>> 'a' 是 s 真的 >>> 'a' == s 真的 >>> intern('a') 是实习生 真的
(我一直在做和你类似的事情,最近移植了一个应用程序)
我从其他答案和我的经验中收集了一个 wiki。随意编辑和添加东西,但请尽量坚持实用的建议,而不是列出损坏的东西。这是与 Jython 站点不同的旧列表。
Jython 不使用引用计数,因此资源在被垃圾回收时被释放,这比您在等效的 CPython 程序中看到的要晚得多
open('file').read()
不会自动关闭文件。最好使用with open('file') as fp
成语。mysqldb
是 ac 模块,因此在 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
为?
。
unichr(0xd800)
会导致异常,并且u'\ud800'
在代码中包含文字只会造成严重破坏。The Jython project is still alive, but is not fast-moving. The dev mailing list has about 20 messages a month, and there seem to be only about 2 developers commiting code lately.
前段时间,当我将一个项目从 CPython 切换到 Jython 时,我意识到时间关键部分的速度降低了高达 50 倍。正因为如此,我留在了 CPython。
但是,现在的版本可能已经改变了。
您可能还想研究JPype。我不确定它与 Jython 相比有多成熟,但它应该允许 CPython 访问 Java 代码。
最近,我和一个小组一起为我学校的一位教授做一个项目。早期,我们决定用 Python 编写项目。我们绝对应该使用 CPython。我们用 Python 编写了程序,我们所有的单元测试最终都成功了。因为大多数人已经在他们的计算机上安装了 Java,而不是 Python,所以我们决定将其部署为 Jython jar。因此,我们使用 Swing 编写了 GUI,因为它包含在 Java 的标准库中。
我第一次使用 Jython 运行程序时,它立即崩溃了。一方面,csv.reader 的“.fieldnames”似乎总是无。因此,我不得不更改我们代码的几个部分来解决这个问题。
我的代码的另一部分也崩溃了,它在 CPython 上运行良好。Jython 指责我在分配任何东西之前引用了一个变量(这让我发疯了,事实并非如此)。这是一个例子:ActiveState's Code Recipe's external sort
更糟糕的是,表演很糟糕。基本上,这段代码结合了几个 CSV 文件,其中一个大约 2 GB。在 CPython 中,它在 8.5 分钟内运行。在 Jython 中,它在 25 分钟内运行。
这些问题发生在 2.5.2rc2(撰写本文时的最新版本)。