java调用python

今天遇到java调用一个python脚本的问题,纠结了大半天,遇到各种问题。网上搜索的大部分都是用jython,但是我想要调用的python脚本里有import urllib,这个urllib也不是什么第三方扩展库,在python的安装path下的lib下就有,在python命令行下肯定是能找到的。但是用jython的话,sys的path里面就太少了。示例代码:

import org.python.core.py;
import org.python.core.pysystemstate;
import org.python.util.pythoninterpreter;
public class test3 {
/**
* @param args
*/
public static void main(string[] args) {
pythoninterpreter interpreter = new pythoninterpreter();
pysystemstate sys = py.getsystemstate();
//sys.path.add(“d:\\jython2.5.2\\lib”);
system.out.println(sys.path.tostring());
interpreter.exec(“print ‘hello'”);
interpreter.exec(“import sys”);
interpreter.exec(“print sys.path”);
// interpreter.exec(“import urllib”);
// interpreter.exec(“print urllib”);
}
}

打印出来的sys.path为:

txt代码

[‘d:\\eclipse_jee_workspace\\zlabtest\\lib\\lib’, ‘__classpath__’, ‘__pyclasspath__/’]

这儿就只有eclipse的工程的路径包含了,所以当然找不到urllib啦。而在命令行下打印sys.path为:

用jython差的lib库少太多了,也懒得用类似sys.path.add(“d:\\jython2.5.2\\lib”);一个一个加了,所以果断放弃jython。

然后查到可以用runtime.getruntime().exec(“python test.py”);示例代码如下:

import java.io.bufferedreader;
import java.io.inputstreamreader;
public class test5 {
public static void main(string[] args){
try{
system.out.println(“start”);
process pr = runtime.getruntime().exec(“python test.py”);
bufferedreader in = new bufferedreader(new
inputstreamreader(pr.getinputstream()));
string line;
while ((line = in.readline()) != null) {
system.out.println(line);
}
in.close();
pr.waitfor();
system.out.println(“end”);
} catch (exception e){
e.printstacktrace();
}
}
}

test.py的文件内容为:

python代码

import sys
import urllib
print “hello”
print sys.path

java程序运行的结果为:

txt代码

start
hello
[‘d:\\eclipse_jee_workspace\\zlabtest’, ‘c:\\windows\\system32\\python27.zip’, ‘d:\\python27\\dlls’, ‘d:\\python27\\lib’,
‘d:\\python27\\lib\\plat-win’, ‘d:\\python27\\lib\\lib-tk’, ‘d:\\python27’, ‘d:\\python27\\lib\\site-packages’]
end

这就比较对了。但是中途还是遇到了很多问题,在eclipse中运行上面的java程序抛出异常:

java.io.ioexception: cannot run program “python”: createprocess error=2, ϵͳÕҲ»µ½ָ¶

at java.lang.processbuilder.start(processbuilder.java:460)

at java.lang.runtime.exec(runtime.java:593)

at java.lang.runtime.exec(runtime.java:431)

at java.lang.runtime.exec(runtime.java:328)

at com.mysrc.test5.main(test5.java:10)

caused by: java.io.ioexception: createprocess error=2, ϵͳÕҲ»µ½ָ¶

at java.lang.processimpl.create(native method)

at java.lang.processimpl.(processimpl.java:81)

at java.lang.processimpl.start(processimpl.java:30)

at java.lang.processbuilder.start(processbuilder.java:453)

… 4 more

就是没法调用python程序,而如果是在命令行下用javac编译,然后java执行的话肯定是对的。怎么才能在eclipse里也能正常运行了,网上查了半天,在run configurations->environment新建一个path,值设为安装的python的路径,再运行就ok了。

Posted in 未分类

发表评论