【问题标题】: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();
}
}
}
}