python如何调用java语言_使用python调用java-jpype-Go语言中文社区

一、jpype

1.环境(我的电脑是windows 64位):

python2.7(32位),jdk1.5(32位),JPype-0.5.4.2.win32-py2.7.exe ,https://sourceforge.net/projects/jpype/files/JPype/0.5.4/

2.测试:

#coding=utf-8

#!/usr/bin/python

import jpype

from jpype import *

import os.path

jvmPath = jpype.getDefaultJVMPath()

if not jpype.isJVMStarted():

jpype.startJVM(jvmPath,'-ea')

#jarpath = os.path.join(os.path.abspath('.'), 'build/jar')

#startJVM(r"D:worktoolsJavajdk1.5jrebinserverjvm.dll", "-ea")

jpype.java.lang.System.out.println("Hello World")

jpype.shutdownJVM()

直接在cmd命令行执行python test.py就可以了

二、调用jar包

http://blog.csdn.net/newxren/article/details/7351200

我之前一直按照网上博客写的打jar包的方式调用执行,总是报找不到类的错误,python代码:

import jpype

from jpype import *

jvmPath = jpype.getDefaultJVMPath()

ext_classpath = r'D:workworkspaceoutartifactstestjpype_jartestjpype.jar'

#jarpath = os.path.join(os.path.abspath('.'), 'F:/sample_Py/') #os not found

jvmArg = '-Djava.class.path=%s'%ext_classpath

print jvmArg

if not jpype.isJVMStarted():

jpype.startJVM(jvmPath,'-ea',jvmArg)

jpype.java.lang.System.out.println('Hello world!')

javaClass = JClass("com.testjava")

jd = javaClass()

jprint = java.lang.System.out.println

jprint(jd.sayHello("waw"))

jprint(jd.calc(2,4))

jpype.shutdownJVM()报错:

raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)

jpype._jexception.ExceptionPyRaisable: java.lang.Exception: Class JpypeDemo not found

网上找了很多资料,基本就是说java代码中依赖的东西都需要在classpath下,但是我的java代码啥都没依赖啊,哭~~~~

但是很明显的就是class not found肯定是在某个目录下找不到需要的.class文件,然后我就在java文件目录下用javac编译出class文件,然后在当前执行:

D:worktoolspython2.7win32workspacecom>python

Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (In

tel)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> from jpype import *

>>> startJVM(jpype.getDefaultJVMPath(),"-ea")

Traceback (most recent call last):

File "", line 1, in

NameError: name 'jpype' is not defined

>>> import jpype

>>> from jpype import *

>>> jvmPath=jpype.getDefaultJVMPath()

>>> startJVM(jvmPath)

>>> JavaP = JClass("JpypeDemo")

Traceback (most recent call last):

File "", line 1, in

File "D:worktoolspython2.7win32libsite-packagesjpype_jclass.py", line 54

, in JClass

raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)

jpype._jexception.ExceptionPyRaisable: java.lang.Exception: Class JpypeDemo not

found

>>> jpype.java.lang.System.out.println('Hello world!')(执行这一句是可以的)

Hello world!

>>> ^V

后来各种乱改瞎尝试,发现在java代码里面加上package:

package com;

public class JpypeDemo {

private String str = "";

public JpypeDemo() {

this.str = "JpypeDemo Init";

}

public String getStr() {

return str;

}

public void setStr(String str) {

this.str = str;

}

}

用javac编译后,再到com的同级目录下执行下面的python代码就不再报错了:

import jpype

from jpype import *

jarpath = r'D:worktoolspython2.7win32workspace'

startJVM(jpype.getDefaultJVMPath(),"-ea", "-Djava.class.path=%s" % jarpath)

JpypeDemo = jpype.JClass('com.JpypeDemo')

test = JpypeDemo()

res = test.getStr()

print res

jpype.shutdownJVM()

D:worktoolspython2.7win32workspace>python D:worktoolspython2.7win32workspa

ce1120.py

JpypeDemo Init

JVM activity report     :

classes loaded       : 20

JVM has been shutdown

3.访问JAVA的系统属性

假设你要设置的属性名为 yourProperty,属性值为 yourValue 。

1)JVM启动时设置系统变量示例

import jpype

jvmPath = jpype.getDefaultJVMPath()

jvmArg = “ -DyourProperty=yourValue ”

if not jpype.isJVMStarted():

jpype.startJVM(jvmPath,jvmArg)

2)在程序中设置系统变量示例

import jpype

prop = “ yourProperty ”

value = “ yourValue ”

system = jpype.JClass('java.lang.System')

system.setProperty(str(prop),str(value))

3)在程序中获取系统变量示例

import jpype

prop = “ yourProperty ”

system = jpype.JClass('java.lang.System')

value = system.getProperty(str(prop))

使用python3.5和jdk1.8的环境使用Jpype的介绍:https://liuliqiang.info/post/allthing-about-jpype/

三、其他python知识

这里介绍一下python执行shell命令的四种方法:

1、os模块中的os.system()这个函数来执行shell命令

注,这个方法得不到shell命令的输出。

2、popen()#这个方法能得到命令执行后的结果是一个字符串,要自行处理才能得到想要的信息。

这样得到的结果与第一个方法是一样的。

3、commands模块#可以很方便的取得命令的输出(包括标准和错误输出)和执行状态位

commands.getstatusoutput(cmd)返回(status,output)

commands.getoutput(cmd)只返回输出结果

commands.getstatus(file)返回ls -ld file 的执行结果字符串,调用了getoutput,不建议使用这个方法。

4、subprocess模块

使用subprocess模块可以创建新的进程,可以与新建进程的输入/输出/错误管道连通,并可以获得新建进程执行的返回状态。使用subprocess模块的目的是替代os.system()、os.popen*()、commands.*等旧的函数或模块。

import subprocess

1、subprocess.call(command, shell=True)

#会直接打印出结果。

2、subprocess.Popen(command, shell=True) 也可以是subprocess.Popen(command, stdout=subprocess.PIPE, shell=True) 这样就可以输出结果了。

如果command不是一个可执行文件,shell=True是不可省略的。

shell=True意思是shell下执行command

这四种方法都可以执行shell命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值