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

问题描述 投票:0回答:4

我需要使用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

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

有人有办法解决这个问题吗?

我预先感谢您的帮助,

托马斯。

python virtual-machine
4个回答
1
投票

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

请参阅此链接了解更多信息 https://github.com/LeeKamentsky/python-javabridge/issues/88


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。


0
投票

我找到了令人恼火但有效的解决方案:“RuntimeError:无法启动 Java VM。”注意:此解决方案仅适用于 Google Colab Notebook,也许其他笔记本也有此选项,没关系。
您只需转到“运行时”选项卡并单击“重新启动运行时”,它将重新启动并且 JVM 将再次工作。 enter image description here


0
投票

正如这里提到的JVM问题,多处理解决了这个问题。例如:

from multiprocessing import Process

def my_function(arg1):
  ###
  Code requiring JVM
  ###

if __name__ == "__main__":
  p = Process(target=cell_segmentation, args=(arg1))
  p.start()
  p.join()  # this blocks until the process terminates
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.