视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Java调用Python
2020-11-27 14:27:23 责编:小采
文档


今天遇到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.<init>(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了。

下载本文
显示全文
专题