我有一些 Jython 模块试图在 JAR 中工作。除了某些模块希望从文件系统中打开与 Python 脚本本身位于同一目录中的文件外,一切都设置得很好。这不再起作用,因为这些文件现在已捆绑到 JAR 中。
基本上我想知道是否有 Class.getResourceAsStream() 的等效项,我可以在 Python 代码中使用它来加载这些数据文件。我尝试使用'__pyclasspath__/path/to/module/data.txt'
但它不存在。
在javaClass.getResourceAsStream()
中使用java的类加载系统来查找资源。Python 的类加载机制旨在提供一些类似的功能。其中大部分在此处和PEP 302中进行了描述。
对此的快速总结:
__loader__
属性当从 zip 或 jarfile 加载 python 类时使用default zipimporter
,幸运的是支持此方法。因此,如果您知道数据文件与 python 模块位于同一个 jar 中,则可以使用它的加载器来加载它:
import some_module
data = some_module.__loader__.get_data("path/in/archive/file.txt")
Maybe I'm just missing the point, but can't you use getResourceAsStream() on a Java class?
我有同样的问题,但我不确定我的情况是否完全相同。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 类,所以我知道它会一直存在。