如何在Python中调用打包好的Jar文件?
首先是在anaconda中进入我这个项目对应的一个环境,然后在这个环境中下载并且安装jpype。那么就可以直接import了。但是这里出现了一系列的问题
第一个问题,getDefaultJVM()报错,报的错是找不到默认的JVM,提示我配置好JAVA_HOME
在配置好JAVA_HOME之后,再次试了一下,就还是提示了一下找不到JVM,让我继续配置JAVA_HOME,这里我重启了一下pycharm,然后提示了我下一个问题
第二个问题,python是64位的而我jvm是32位的
我刚开始还不信,于是在网上查了一下,cmd中java -version如果版本中有出现64-bit的字样,那么就说明是64位的,反之则没有,我试了一下,我的果然没有64位字样,说明我的是32位的。接下来就是重装java,记得要首先在环境变量中将我们之前配置的环境变量删除,这个时候可以用个文本文件保存一下,等会儿重装的时候还要配置。删除了环境变量之后再用软件管家卸载java,这里有两个东西,都卸载掉。然后到官网下载,官网上找到windows,有x86和x64的,x86是32位的,下载x64位的JDK,记住一定是安装JDK而不是JRE。安装之后配置一下环境变量,配置之后如果在cmd中输入java -version 和javac都出现提示信息说明配置成功。这一个问题算是解决了,下一个问题。
我测试了一下我打包的项目文件,我用JClass()去找其中的一个类,提示我没有这个类
这个时候我去找了一下很多博客,都不是我这个问题,还有的人说我这个版本不行,说什么jpype不支持jdk1.6以上的,我差点就要放弃了,因为我不会为了这个版本而丢弃1.8,这太蠢了吧。但是后来我尝试了一下用别人的步骤先搭了一个简单的包,而且用cmd javac编译了一个类,并且用jar cvf myjar.jar com打包了这个项目,在python中找到了相应的类,是个JClass类,而且并成功实例化了该类。如果cmd不编译该类,则不能实例化。后面尝试了用IDEA打包,也是可以实例化并执行的。所以问题又来了
如何用IDEA打包我自己的项目代码?
之前提到用JClass去找类的时候提示没有找到这个类,我觉得很奇怪,于是先解压我的jar包,发现它不是第一层目录,里面还有一些杂七杂八的东西,里面还有一个jar包,再次解开这个jar包,才发现是我想要的东西。于是把他引入到我的python项目中,这下成功找到了那个类,而且可以实例化并成功调用相关的方法。这里有个小坑就是,在我们创建artifacts的时候,如果从from mudule with dependencies这个方式创建,那么会创建一个之前说到的那个里面还有很多杂七杂八的东西的jar包,就是说,外层多了一层,而我们实际需要的东西,在整个jar包内部的下一层。所以正确的做法是先创建一个empty的artifact,然后从中添加mudule output,这样子就可以了
这个时候我跑了一下我的项目,发现出现了中文乱码
这个中文乱码是在python调用java某个方法,而这个方法是输出中文,的时候,出现的。
我以为是编码的问题,所以就把两边的file encoding都改成了utf-8。但是调用的时候,还是出现了乱码。而如果用cmd执行jar包,是不会出现乱码的,而且python控制台直接输出中文也是正常的,但是在python的控制台用java的输出,就会出错。而如果java的方法返回一个字符串,在python这边输出,确是很正常的,这就说明。其实jar包并没有乱码的问题,有问题的是,jvm的输出在python这边的虚拟机上出现了乱码,这里猜测是更底层的实现细节,这里没有具体去深究。目前的解决方法就是,不在Java中进行输出,统一在python中输出。但是还有个问题
为什么java代码是先输出了之后才是python输出?明明部分python代码在前面啊?还未搞清楚
如何在Python中调用打包好的Jar文件?的更多相关文章
- 如何在python中调用C语言代码
1.使用C扩展CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码 开发者有三种方法可以在自己的Python代码中来调用C编写的函数-ctypes,SWIG,Python/ ...
- 如何在Python中调用Matlab
检查您的系统是否具有受支持的 Python 版本和 MATLAB R2014b 或更新版本.要检查您的系统上是否已安装 Python,请在操作系统提示符下运行 Python. 1)打开Prompt,输 ...
- 使用ctypes在Python中调用C++动态库
使用ctypes在Python中调用C++动态库 入门操作 使用ctypes库可以直接调用C语言编写的动态库,而如果是调用C++编写的动态库,需要使用extern关键字对动态库的函数进行声明: #in ...
- 如何在Java中调用Python代码
有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调 ...
- JPype:实现在python中调用JAVA
一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...
- 如何在Python中使用Linux epoll
如何在Python中使用Linux epoll 内容 介绍 阻塞套接字编程示例 异步套接字和Linux epoll的好处 epoll的异步套接字编程示例 性能考量 源代码 介绍 从2.6版开始,Pyt ...
- vs2013如何在C++中调用Lua(二)
Lua学习笔记 vs2013如何在C++中调用Lua (此为转载教程) 本人试过完全可行 一.准备工作 1.下载Lua源码,地址:http://www.lua.org/download.html(我用 ...
- 如何在Delphi中调用VC6.0开发的COM
上次写了如何在VC6.0下对Delphi写的COM进行调用,原本想马上写如何在Delphi中调用VC6.0开发的COM时,由于在写事例程序中碰到了个很怪的问题,在我机子上用VC写的接口程序编译能通过. ...
- Python脚本传參和Python中调用mysqldump
Python脚本传參和Python中调用mysqldump<pre name="code" class="python">#coding=utf-8 ...
随机推荐
- NCPC 2016 Fleecing the Raffle
Description A tremendously exciting raffle is being held, with some tremendously exciting prizes bei ...
- Django 05
目录 配置测试脚本文件 单表操作 增加数据 查询数据 修改数据 删除数据 查询十三太保 双下划线查询 连表下的数据增删改 一对多/一对一 多对多 跨表查询 基本对象的跨表查询 (子查询) 基于双下划线 ...
- 【Webpack】373- 一看就懂之 webpack 高级配置与优化
本文原载于 SegmentFault 社区专栏 前海拾贝 作者:JS_Even_JS 一.打包多页面应用 所谓打包多页面,就是同时打包出多个 html 页面,打包多页面也是使用 html-webpac ...
- 理解Vue中的nextTick
参考博客:https://www.jianshu.com/p/a7550c0e164f
- 【原创】005 | 搭上SpringBoot请求处理源码分析专车
前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 专车介绍 该趟专车是开往Spring Boot请求处理源码分析专车,主要用来分析S ...
- CUDA架构及对应编译参数
NVIDIA CUDA C++ 编译器 nvcc 基于每个内核,既可以用来产生特定于体系结构的 cubin 文件,又能产生前向兼容的 PTX 版本. 每个 cubin 文件针对特定的计算能力版本,并且 ...
- 《CSAPP》实验二:二进制炸弹
二进制炸弹是第三章<程序的机器级表示>的配套实验,这章主要介绍了x64汇编,包括:操作数的表示方式,数据传送指令,算术和逻辑指令,控制流跳转指令,过程(procedure)的实现与运行时栈 ...
- 一个小工具帮你搞定实时监控Nginx服务器
Linux运维工程师的首要职责就是保证业务7 x 24小时稳定的运行,监控Web服务器对于查看网站上发生的情况至关重要.关注最多的便是日志变动,查看实时日志文件变动大家第一反应应该是'tail -f ...
- python 多线程编程之进程和线程基础概念
多线程编程 在多线程(multithreaded,MT)出现之前,计算机程序的执行都是由单个步骤序列组成的,该序列组合在主机的CPU中按照同步顺序执行.无论是任务本身需要按照步骤顺序执行,还是整个过程 ...
- 基于Vue的前后端分离项目实践
一.为什么需要前后端分离 1.1什么是前后端分离 前后端分离这个词刚在毕业(15年)那会就听说过,但是直到17年前都没有接触过前后端分离的项目.怎么理解前后端分离?直观的感觉就是前后端分开去做,即功 ...