python - Python:javabridge虚拟机只工作一次
问题描述
我需要使用 bioformats-python 来读取显微镜图像。要使用它,需要 Java VM。
我只能使用一次 java VM,如果我再次执行我的 python 脚本,我会得到一个错误。
如果我重新启动 spyder 内核,脚本只会再次运行。
我安装了 JDK (8u181) 并设置了路径变量。我将 Spyder 与 python 3.6 一起使用。
这是我用来测试 java VM 的代码:
import javabridge
javabridge.start_vm(run_headless=True)
try:
print(javabridge.run_script('java.lang.String.format("Hello, %s!", greetee);',
dict(greetee='world')))
finally:
javabridge.kill_vm()
我第一次执行得到的结果:
>>> Hello, world!
这是我第二次尝试运行它时收到的错误消息:
Traceback (most recent call last):
File "C:\Users\Z820\Miniconda3\envs\py37\lib\site-packages\javabridge\jutil.py", line 281, in start_thread
env = vm.create(args)
File "_javabridge.pyx", line 653, in _javabridge.JB_VM.create
RuntimeError: Failed to create Java VM. Return code = -1
Failed to create Java VM
Traceback (most recent call last):
File "<ipython-input-2-81778b2b637e>", line 1, in <module>
runfile('C:/Users/Z820/Desktop/Python/Fichier_Python/Projet_correlation/Replace Fiji/usebioformas.py', wdir='C:/Users/Z820/Desktop/Python/Fichier_Python/Projet_correlation/Replace Fiji')
File "C:\Users\Z820\Miniconda3\envs\py37\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 678, in runfile
execfile(filename, namespace)
File "C:\Users\Z820\Miniconda3\envs\py37\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 106, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/Z820/Desktop/Python/Fichier_Python/Projet_correlation/Replace Fiji/usebioformas.py", line 10, in <module>
javabridge.start_vm(run_headless=True)
File "C:\Users\Z820\Miniconda3\envs\py37\lib\site-packages\javabridge\jutil.py", line 314, in start_vm
raise RuntimeError("Failed to start Java VM")
RuntimeError: Failed to start Java VM
如果我尝试第三次启动它,我会收到一条略有不同的错误消息。
有没有人有解决这个问题的想法?
我提前感谢您的帮助,
托马斯。
解决方案
问题与此类似:
https://jpype.readthedocs.io/en/latest/userguide.html#unloading-the-jvm
卸载 JVM
JNI API 定义了一个名为destroyJVM() 的方法。但是,这种方法不起作用。也就是说,Sun 的 JVM 不允许卸载。因此,在调用shutdownJVM() 之后,如果您再次尝试调用startJVM(),您将得到一个非特定异常。JPype 没有任何问题(我可以看到)。因此,如果 Sun 能够适当地支持它自己,或者如果您将 JPype 与非 SUN JVM 一起使用(我相信 IBM 的 JVM 支持 JNI 调用,但我不知道他们的 destroyJVM 是否正常工作),JPype 将能够利用它。在撰写本文时,最新的稳定 Sun JVM 是 1.4.2_04。
推荐阅读
- scala - Maven Scala 插件增加了构建时间
- unity3d - 软盘图标 游戏运行时屏幕中间
- postgresql - typeOrm 不在模式中创建条目
- javascript - 如何在猫鼬中正确使用 findOneAndUpdate?
- node.js - 从 nodejs requet 获取响应
- java - 在日历中使用事件名称而不是电子邮件主题
- reactjs - 使用 @steveeeie/react-page-transition 时组件不渲染
- swift - 通过 Unity 使用 ARKit 创建的 ARWorldMap 的持久性
- python - 无法通过 websockets 连接(daphne、django、nginx、docker)
- sparql - 如何从 Protege 运行 SPARQL-select 到 Wikidata?