lc_buzhidao
阿刁阿
采纳率66.7%
2020-09-05 12:56

python是否引入第三方包,将决定程序是否异常,为何?

500

任务是使用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那边我也不了解细节,而且由于公司内网环境, 一开始没法提供更详细的信息,增加了思考问题的难度,如果最后有直接解决问题的答案,就采纳该答案,如果没有,则采纳对解决问题有参考意义的答案。谢谢各位。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • weixin_50673588 weixin_50673588 7月前

    因为被加载的动态库依赖正确匹配版本的该动态库,所以如果python环境中的该动态库版本相对被加载动态库来说不合适,那么就会导致加载dll失败。解决方法是找到匹配版本的动态库,然后替换掉。一般可以从被加载库的依赖库中找到该动态库的正确匹配版本。

    点赞 1 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 8月前

    你在java程序里调用这个jar看看是否能调用
    检查下jdk的版本,以及环境变量里 jdk java_home 的设置,是否正确配置
    你的第三方包是否和java不同,是64bit的?
    第三方包是否有别的依赖库丢失、没有安装或者不兼容。第三方包通过 pip install自动安装看看。
    关闭杀毒软件看看。

    点赞 2 评论 复制链接分享
  • dabocaiqq dabocaiqq 8月前

    看看是不是32bit和64bit不对应,不兼容,或者缺少包

    点赞 1 评论 复制链接分享
  • kingwolf_JavaScript 浴火_凤凰 8月前

    1.dll文件放到 jdk的bin目录或者system32下面 试试
    2.检查**JDK**和**DLL**文件的版本,确定都是32位或者64位

    点赞 评论 复制链接分享

相关推荐