4

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

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

4

3 回答 3

4

在javaClass.getResourceAsStream()中使用java的类加载系统来查找资源。Python 的类加载机制旨在提供一些类似的功能。其中大部分在此处PEP 302中进行了描述。

对此的快速总结:

  • 当一个python模块被加载时,它的加载器应该设置__loader__属性
  • 加载器应支持其他方法从同一源获取数据

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

import some_module
data = some_module.__loader__.get_data("path/in/archive/file.txt")
于 2013-06-02T18:26:06.683 回答
0

Maybe I'm just missing the point, but can't you use getResourceAsStream() on a Java class?

于 2013-06-05T18:24:37.047 回答
0

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

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

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

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

于 2013-06-24T22:52:47.220 回答