任务是使用python对java做api测试。
我有一段通过python调用java api的代码,该代码诡异的地方在于,当我import第三方包时,就会导致异常,如果没有引入第三方包,则可以正常运行。
代码类似如此:
import jpype
import xlwt # 这一步注释与否会决定是否报错
if __name__ == "__main__":
jars = "D:\MyJar.jar"
jvm_path = jpype.getDefaultJVMPath()
jvm_cp = "-Djava.class.path={}".format(jars))
if not jpype.isJVMStarted():
startJVM(jvm_path, jvm_cp)
JCls = jpype.JPackage('package_name').class_name
Jcls = JCls()
jcls.open_service() # 报错的地方,因为这个接口会加载C的dll库。
其中关键的地方在于,java api会去load一个.dll文件。如果没有import xlwt这一步,那么dll是可以正常加载成功,且接口可以正常调用。但是如果有import xlwt这一步,那么java load dll的功能就会抛出异常,报找不到应用程序。
import xlwt只是一个举例,根据测试,导入其他第三方包,并且包的__init__.py中有import其他模块的指令,都会导致这种情况出现。
报错信息如图:
实在搞不懂python import第三方包怎么会导致这个问题出现。
环境:win7 64bit;python3.7 32bit, jdk 32bit.
应该怎样解决,请教各位,谢谢!
补充说明:
java程序里调用这个jar没问题,甚至在python里,当没有导入第三方包时,调用这个jar也没问题;
jdk版本是32bit的,环境变量也正确配置 第三方包就是python里site-packages通过pip install安装的包
.dll文件的路径,有配置在环境变量里,java通过环境变量里的配置来获取路径。jdk的版本是32bit。dll的没确定,不过在不导入第三方包的情况下,是可以调用起来的
这个问题涉及到多语言调用,java和c那边我也不了解细节,而且由于公司内网环境, 一开始没法提供更详细的信息,增加了思考问题的难度,如果最后有直接解决问题的答案,就采纳该答案,如果没有,则采纳对解决问题有参考意义的答案。谢谢各位。
因为被加载的动态库依赖正确匹配版本的该动态库,所以如果python环境中的该动态库版本相对被加载动态库来说不合适,那么就会导致加载dll失败。解决方法是找到匹配版本的动态库,然后替换掉。一般可以从被加载库的依赖库中找到该动态库的正确匹配版本。
看看是不是32bit和64bit不对应,不兼容,或者缺少包
1.dll文件放到 jdk的bin目录或者system32下面 试试
2.检查**JDK**和**DLL**文件的版本,确定都是32位或者64位
你在java程序里调用这个jar看看是否能调用
检查下jdk的版本,以及环境变量里 jdk java_home 的设置,是否正确配置
你的第三方包是否和java不同,是64bit的?
第三方包是否有别的依赖库丢失、没有安装或者不兼容。第三方包通过 pip install自动安装看看。
关闭杀毒软件看看。