阿刁阿 2020-09-05 12:56 采纳率: 100%
浏览 139
已采纳

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

任务是使用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 2020-10-05 11:19
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler