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