Python:javabridge虚拟机只能运行一次

时间:2018-07-27 08:56:02

标签: python virtual-machine

我需要使用bioformats-python读取显微镜图像。要使用它,需要Java VM。

我只能使用Java VM一次,如果我再次执行python脚本,则会收到错误消息。

如果我重新启动spyder内核,该脚本将仅再次起作用。

我安装了JDK(8u181)并设置了路径变量。 我在python 3.6中使用了Spyder。

这是我用来测试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

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

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

在此先感谢您的帮助,

托马斯。

2 个答案:

答案 0 :(得分:0)

这是JVM的局限性,start_vm()只能使用一次。

有关更多信息,请参见此链接 https://github.com/LeeKamentsky/python-javabridge/issues/88

答案 1 :(得分:0)

问题与此类似:

https://jpype.readthedocs.io/en/latest/userguide.html#unloading-the-jvm

  

卸载JVM

     

JNI API定义了一个称为destroyJVM()的方法。   但是,此方法不起作用。也就是说,Sun的JVM不允许   卸货。因此,在调用shutdownJVM()之后,如果您   再次尝试调用startJVM()将会得到一个非特定的   例外。 JPype中没有任何错误(我可以看到)。所以如果太阳   可以适当地支持自己,或者如果您将JPype与   非SUN JVM可以做到(我相信IBM的JVM支持JNI调用,   但我不知道他们的destroyJVM是否可以正常运行),JPype将   能够利用它。截至撰写本文时,最新   稳定的Sun JVM是1.4.2_04。