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