首页 > 解决方案 > jpype.startjvm 退出而不给出任何错误消息

问题描述

我正在尝试使用Python MPXJ分析 mpp 文件中的信息。在我的 Windows 10 机器上,我安装了 32 位 Python 3.8.0,JPYPE并由pip install jpype1. 我还在C:\Program Files (x86)\Java\jre1.8.0_301.

但是,以下脚本根本失败

import jpype

print(jpype.getDefaultJVMPath())
jpype.startJVM()
print("JVM successfully started")
jpype.shutdownJVM()

它显示默认路径为C:\Program Files (x86)\Java\jre1.8.0_301\bin\client\jvm.dll,但是没有执行下一个打印行,也没有startJVM给出任何错误输出。执行结果如下

> python testjvm.py
C:\Program Files (x86)\Java\jre1.8.0_301\bin\client\jvm.dll

所以startJVM被执行,但不给任何东西就退出。

有没有办法进一步调试可能是什么问题?


ipython根据约翰的建议,我正在做进一步的调试。它c:\python38\lib\site-packages\jpype\_core.py(226)与以下上下文有关

> c:\python38\lib\site-packages\jpype\_core.py(225)startJVM()
    223                         % (','.join([str(i) for i in kwargs])))
    224
3-> 225     try:
    226         _jpype.startup(jvmpath, tuple(args),
    227                        ignoreUnrecognized, convertStrings, interrupt)

ipdb> jvmpath
'C:\\Program Files (x86)\\Java\\jre1.8.0_301\\bin\\client\\jvm.dll'
ipdb> args
args = []
kwargs = {}
ipdb> tuple(args)
()
ipdb> ignoreUnrecognized
False
ipdb> convertStrings
False
ipdb> interrupt
False

然后无论我按snon _jpype.startup,ipython 都没有任何提示退出

标签: javapythonjpype

解决方案


感谢 John Hennig 的评论,指出根本原因可能是 x86 和 x64 不兼容问题。

我对每个JVM 启动调试进行了一些进一步的调试。基本上,它使用与 Visual Studio 一起使用的 Dumpbin实用程序来检查每个组件以查看它是 x86 还是 x64。如果其中任何一个不兼容,jvm start 将崩溃。

原来我机器上的python.exeandjvm.dll都是x86的。但是,当where用于定位依赖项时

    KERNEL32.dll
    USER32.dll
    ADVAPI32.dll
    WSOCK32.dll
    WINMM.dll
    VERSION.dll
    PSAPI.DLL
    VCRUNTIME140.dll
    api-ms-win-crt-stdio-l1-1-0.dll
    api-ms-win-crt-string-l1-1-0.dll
    api-ms-win-crt-runtime-l1-1-0.dll
    api-ms-win-crt-convert-l1-1-0.dll
    api-ms-win-crt-environment-l1-1-0.dll
    api-ms-win-crt-utility-l1-1-0.dll
    api-ms-win-crt-math-l1-1-0.dll
    api-ms-win-crt-filesystem-l1-1-0.dll
    api-ms-win-crt-time-l1-1-0.dll
    api-ms-win-crt-heap-l1-1-0.dll

原来第一个 dllKERNEL32.dll位于 中c:\Windows\System32,它是 x64。其他 dll 也是如此。由于它们是 x64 窗口中的系统默认 dll,因此用 x86 替换它们将非常棘手。所以不可能在 x64 窗口中使用带有 JPype 的 python x86 版本。

解决方案很简单,将 python/java 更改为 x64 版本可以解决问题。


推荐阅读