java - 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
然后无论我按s
或n
on _jpype.startup
,ipython 都没有任何提示退出
解决方案
感谢 John Hennig 的评论,指出根本原因可能是 x86 和 x64 不兼容问题。
我对每个JVM 启动调试进行了一些进一步的调试。基本上,它使用与 Visual Studio 一起使用的 Dumpbin实用程序来检查每个组件以查看它是 x86 还是 x64。如果其中任何一个不兼容,jvm start 将崩溃。
原来我机器上的python.exe
andjvm.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 版本可以解决问题。
推荐阅读
- forms - vue-electron-builder 插件 - 将表单数据从 vue 传递到主电子进程
- c# - 如何使用 Linq 选择所需的数据
- node.js - AWS sam SES sendEmail 导致 InvalidClientTokenId (nodejs/lambda)
- azure - 使用 Get-AzureStorageBlobContent 从 ADL Gen2 下载 parquet 文件
- linux - 如何在真实硬件上使用 LTP(Linux 测试项目)进行 Linux 内核测试?
- python - 如何在没有 numpy 或 pandas 的情况下从文本文件计算平均值
- javascript - 函数 slideToggle 仅检测 div 脚本的先前打开/关闭状态 javascript
- excel - 如何在 VBA 中使用 .numberformat 类型的变量作为比较器
- javascript - 如何使用 vanilla JS 或 CSS 以编程方式关闭 html 日期选择器?
- azure - 在 Cosmos DB 中计算限制