首页 > 解决方案 > 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

如果我尝试第三次启动它,我会收到一条略有不同的错误消息。

有没有人有解决这个问题的想法?

我提前感谢您的帮助,

托马斯。

标签: pythonvirtual-machine

解决方案


问题与此类似:

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。


推荐阅读