在java应用程序中执行python单独的应用程序

时间:2014-04-14 07:58:01

标签: java python postgresql native

我有一个小的java项目,它做了几个活动,包括数据库更新,我有一个单独的python(.py)应用程序,它在数据挖掘过程后更新同一个数据库。在我的Java应用程序中,我需要打开(执行)我的python应用程序,它更新同一个数据库。我尝试了几种方法,但代码不起作用。下面我粘贴初始代码而不调用.py文件。

 if (getDB("BP") != 0.0 && getDB("BT") != 0.0 &&
     getDB("SO2") != 0.0 && getDB("HR") != 0.0) {
             if(analyzeData(inputLine)) {
                setDB(inputLine);
        //<python(.py) file should execute independently in this section, after setDB(inputLine)>
             } } 
             else { 
                  setNormalBio(inputLine); 
                  }

1 个答案:

答案 0 :(得分:1)

我没有看到任何与从java代码生成新进程相关的内容。你真的在调查这个话题吗?如果不是:不要指望以下代码成为一流的解决方案。也许在http://docs.oracle.com/javase/6/docs/api/java/lang/ProcessBuilder.html和python文档中深入挖掘,我记得,当我从PHP做到这一点时,我遇到了python代码本身的一些问题。


Python(deadparrot.py):

from os import chdir, name as osname
from os.path import dirname, abspath

def voom():
    if osname == 'posix':
        chdir(dirname(abspath(__file__)))
    return "Testing! This is your nine o'clock alarm call!"

if __name__ == '__main__':
    print voom()
    exit(0)

我不确定chdir-call。一旦得到一个项目,我需要在一个带有php的linux webserver环境中调用python(因此&#39; posix&#39;),并在python脚本中做相对修补的东西。 IIRC我在本地windows环境下测试时并不需要它。

编辑1:我在Windows 7中对它进行了测试。看起来既不需要pb.directory(...)或chdir(...),也不需要从python脚本调用相关的pathes。关于linux的IDK。

关于&#39; __ main __ &#39;条件。我正在使用它,因为这样我仍然可以从java-app调用脚本(exit(0)在unix-terminology中返回一个ok),另外使用另一个python脚本的voom()函数,如下所示:

from deadparrot import voom

voom()


爪哇:

package test;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

public class TestJavaAppClean {

    public static void main(String[] args) {
        ProcessBuilder pb = null;
        Process p = null;
        BufferedReader br = null;

        try {
            String top = "C:\\Users\\MaxMueller\\Documents\\test\\";
            String cmd = "C:\\Python27\\python.exe";
            String arg = "deadparrot.py";
            pb = new ProcessBuilder(new String[]{cmd, top + arg});
            pb.directory(new File(top));
            p = pb.start();
            br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (Exception ex) {

        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException ex) {
            }
            if (p != null) {
                p.destroy();
            }
        }
    }
}