我有一些Jython模块,我正试图在JAR中进行工作。一切都设置得很好,除了一些模块希望打开文件系统中与Python脚本本身位于同一目录中的文件。这不再起作用了,因为这些文件现在已捆绑到JAR中。
基本上我想知道是否有类似的Class.getResourceAsStream(),我可以在Python代码中使用它来加载这些数据文件。我尝试使用'__pyclasspath__/path/to/module/data.txt'
,但它不存在。
答案 0 :(得分:4)
在java Class.getResourceAsStream()
中使用java的类加载系统来查找资源。 Python的类加载机制旨在提供一些类似的功能。其中大部分内容都是here和PEP 302。
快速总结:
__loader__
属性从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类,所以我知道它总会在那里。