如何在Jython模块中加载数据文件?

时间:2013-05-22 21:19:43

标签: java python jython

我有一些Jython模块,我正试图在JAR中进行工作。一切都设置得很好,除了一些模块希望打开文件系统中与Python脚本本身位于同一目录中的文件。这不再起作用了,因为这些文件现在已捆绑到JAR中。

基本上我想知道是否有类似的Class.getResourceAsStream(),我可以在Python代码中使用它来加载这些数据文件。我尝试使用'__pyclasspath__/path/to/module/data.txt',但它不存在。

3 个答案:

答案 0 :(得分:4)

在java Class.getResourceAsStream()中使用java的类加载系统来查找资源。 Python的类加载机制旨在提供一些类似的功能。其中大部分内容都是herePEP 302

快速总结:

  • 加载python模块时,它的加载器应该设置__loader__属性
  • 加载程序应支持additional methods从同一来源获取数据

从zip或jar文件加载python类时使用的默认zipimporter,幸运地支持这种方法。因此,如果您知道数据文件与python模块位于同一个jar中,您可以使用它的加载器来加载它:

import some_module
data = some_module.__loader__.get_data("path/in/archive/file.txt")

答案 1 :(得分:0)

也许我只是忽略了这一点,但你不能在Java类上使用getResourceAsStream()吗?

答案 2 :(得分:0)

我有同样的问题,但我不确定我的情况是否完全相同。在我将.jar推送到网上并尝试WebStart之前,我没有看到关于缺少get_data的例外情况(本地WebStarting并使用java -jar启动我的jar工作正常)。

无论如何,这就是我解决问题的方法:

import SomeClass
url = SomeClass.getClassLoader().findResource('path/to/resource.txt')
inputStream = url.openStream()
# ...

SomeClass是我的.jar文件中的Java类。它恰好是我用来启动Jython解释器的Java类,所以我知道它总会在那里。