【问题标题】:Execute a python separate application in a java application在java应用程序中执行python单独的应用程序
【发布时间】:2014-04-14 07:58:01
【问题描述】:

我有一个小型 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 python postgresql native


【解决方案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 调用。一旦有一个项目,我需要在 linux 网络服务器环境中使用 php 调用 python(因此是 'posix'),并在 python 脚本中使用相对路径做一些事情。 IIRC 我在本地 Windows 环境中进行测试时不需要它。

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

关于 '__main__' 条件。我正在使用它,因为这样我仍然可以从 java-app 调用脚本(exit(0) 在 unix-terminology 中返回 ok),此外还可以使用另一个 python-script 中的 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();
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 2013-01-19
    • 2011-09-05
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多