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

  1. import org.python.core.Py;
  2. import org.python.core.PySystemState;
  3. import org.python.util.PythonInterpreter;
  4. public class Test3 {
  5. /**
  6. * @param args
  7. */
  8. public static void main(String[] args) {
  9. PythonInterpreter interpreter = new PythonInterpreter();
  10. PySystemState sys = Py.getSystemState();
  11. //sys.path.add("D:\\jython2.5.2\\Lib");
  12. System.out.println(sys.path.toString());
  13. interpreter.exec("print 'hello'");
  14. interpreter.exec("import sys");
  15. interpreter.exec("print sys.path");
  16. //        interpreter.exec("import urllib");
  17. //        interpreter.exec("print urllib");
  18. }
  19. }

打印出来的sys.path为:

  1. ['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");示例代码如下:

  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. public class Test5 {
  4. public static void main(String[] args){
  5. try{
  6. System.out.println("start");
  7. Process pr = Runtime.getRuntime().exec("python test.py");
  8. BufferedReader in = new BufferedReader(new
  9. InputStreamReader(pr.getInputStream()));
  10. String line;
  11. while ((line = in.readLine()) != null) {
  12. System.out.println(line);
  13. }
  14. in.close();
  15. pr.waitFor();
  16. System.out.println("end");
  17. } catch (Exception e){
  18. e.printStackTrace();
  19. }
  20. }
  21. }

test.py的文件内容为:

  1. import sys
  2. import urllib
  3. print "hello"
  4. print sys.path

java程序运行的结果为:

  1. start
  2. hello
  3. ['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']
  4. 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了。

Java调用Python脚本的更多相关文章

  1. java调用python脚本并向python脚本传递参数

    1.安装Eclipse 先安装jdk,再安装Eclipse,成功后开始建立py_java项目,在这个项目的存储目录SRC下建立test包,在test包中New-Class,新建MyDemo类,建好完成 ...

  2. (转)java调用python脚本

    这篇博客旨在吐血分享今天遇到的java调用python脚本遇到的坑,折腾了3个多小时终于可以跑通了,代码超级短,但网上的好多资料都是抄来抄去的,很少有能够直接跑通的,尤其是针对你的python文件中用 ...

  3. 通过Java调用Python脚本

    在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...

  4. [Java/Python] java调用python脚本问题记录

    Java调用Python的的两种方式 1.Runtime private static String call_python(String input_argv) { String python_py ...

  5. Java调用Python脚本并获取返回值

    在Java程序中有时需要调用Python的程序,这时可以使用一般的PyFunction来调用python的函数并获得返回值,但是采用这种方法有可能出现一些莫名其妙的错误,比如ImportError.在 ...

  6. java 调用 python 脚本

    有时候在java项目里,需要执行Python脚本以下几种方式: 1.直接执行Python脚本代码 引用 org.python包 创建一个 python解释器,貌似这种方式不可以导入第三方库,模块... ...

  7. Java调用Python脚本工具类

    [本文出自天外归云的博客园] 在网上查了很多方法都不成功,在google上搜到一篇文章,做了一些小修改,能够处理中文输出.提取一个运行python脚本的Java工具类如下: package com.a ...

  8. Java 调用python说明文档

    Java 调用python说明文档 通过java调用python脚本主要如下三种方式: 1.直接执行python脚本: 2.执行python.py文件: 3.使用Runtime.getRuntime( ...

  9. java中怎么调用python 脚本

    调用方法: import java.io.BufferedReader; import java.io.InputStreamReader; public class PythonInvoke { p ...

随机推荐

  1. redis的分布式解决方式--codis

    codis是豌豆荚开源的分布式server.眼下处于稳定阶段. 原文地址:https://github.com/wandoulabs/codis/blob/master/doc/tutorial_zh ...

  2. 【D3.V3.js系列教程】--(十二)坐标尺度

    [D3.V3.js系列教程]--(十二)坐标尺度 1.多种类型的缩放尺度 Quantitative Scales Linear Scales Identity Scales Power Scales ...

  3. BZOJ 2301 Problem b(莫比乌斯反演+分块优化)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=37166 题意:对于给出的n个询问,每次求有多少个数对(x,y),满 ...

  4. 浮点数(double)的优势

    用 double 处理大数据 , 即使字符串位数超百位,同样可以用 sscanf 或 atof 来处理,却不会变成负数,原因是浮点数可以用指数表示,但精度会丢失,下面介绍利用这个性质解决的一些问题: ...

  5. [C#绘图]在半透明矩形上绘制字符串

    首先要绘制一个半透明的矩形,用到的方法当然是FillRectangle().这个函数在调用的时候除了要指明要绘制的矩形外,还要指明填充矩形的背景色.具体的方法就是在绘制矩形的时候传给它一个画刷Brus ...

  6. Hadoop学习笔记(3)hadoop伪分布模式安装

    为了学习这部分的功能,我们这里的linux都是使用root用户登录的.所以每个命令的前面都有一个#符号. 伪分布模式安装步骤: 关闭防火墙 修改ip地址 修改hostname 设置ssh自动登录 安装 ...

  7. Qt多线程编程总结(二)——QMutex

    QMutex类提供的是线程之间的访问顺序化. QMutex的目的是保护一个对象.数据结构或者代码段,所以同一时间只有一个线程可以访问它.(在Java术语中,它和同步关键字“synchronized”很 ...

  8. 基于Visual C++2013拆解世界五百强面试题--题6-double类型逆序

    请设计一个函数,不许用到字符串函数,用数学运算,将double类型数据转换,例如123.456转换成654.321 首先想到依次提取他的每一个位数,然后进行运算,移动每一位数到相应位置,结果相加就能逆 ...

  9. HDU 1358 Period KMP

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1358 求周期问题,简单KMP—— AC代码: #include <iostream> # ...

  10. android点滴之PendingIntent的使用

    一概念 PendingIntent就是一个能够在满足一定条件下运行的Intent,它相比于Intent的优势在于自己携带有Context对象.这样他就不必依赖于某个activity才干够存在. 它和I ...