在java应用程序中执行一个python独立的应用程序



我有一个小的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); 
                  }

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


Python(deadprotot.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调用。有一次我得到了一个项目,在这个项目中,我需要用php(因此称为"posix")在linux Web服务器环境中调用python,并在python脚本中使用相对路径。IIRC我在本地windows环境上测试时不需要它

编辑1:我在Windows7中测试过它。看起来不需要pb.directory(…)或chdir(…),就可以从python脚本中调用relativ路径。关于linux的IDK

关于'__main__'条件。我使用这个,因为这样我仍然可以从java应用程序调用脚本(exit(0)在unix术语中返回ok),此外还可以使用另一个python脚本中的voom()函数,如下所示:

from deadparrot import voom
voom()


Java:

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();
            }
        }
    }
}

最新更新