进程Builder java无法在java中运行一些python代码。怎么解决?

时间:2016-10-05 10:26:01

标签: java python parsing rdf processbuilder

我使用java创建ProcessBuilder来运行python。

这两个py都可以在python程序中成功运行。 (这两个py没有代码问题)

input.py:

print 'hello'  
number=[3,5,2,0,6]  
print number  
number.sort()  
print number  
number.append(0)  
print number  
print number.count(0)  
print number.index(5)

TESTopenBaseOnt.py:

from rdflib import URIRef, Graph, Namespace
from rdflib.plugins.parsers.notation3 import N3Parser
from rdflib.namespace import RDF, OWL, RDFS
from rdflib import URIRef, BNode, Literal
from rdflib import Namespace
from rdflib.namespace import RDF, FOAF, RDFS
from rdflib import Graph

gUpdate = Graph()
print ".> Step....1"
gUpdate.parse("BBCOntology.rdf" )
print ".> Step....2"
print gUpdate.serialize(format='xml')
print ".>  Finished......."
#

你可以看到图片。

该代码适用于python:input.py 但是,它不适用于python:TESTopenBaseOnt.py
可能是因为java无法在python中运行parse函数。结果显示,程序停在第1步。

public static void main(String [] args) throws IOException
    {

        try

        {
        ProcessBuilder pb = new ProcessBuilder("C:/Python27/python","C:Desktop//searchTestJava//input.py");

//      ProcessBuilder pb = new ProcessBuilder("C:/Python27/python","C:Desktop//searchTestJava//TESTopenBaseOnt.py");



        Process p = pb.start();
        BufferedReader bfr = new BufferedReader(new InputStreamReader(p.getInputStream()));

        System.out.println(".........start   process.........");  
        String line = "";     
        while ((line = bfr.readLine()) != null){
            System.out.println("Python Output: " + line);
        }

        System.out.println("........end   process.......");


        }catch(Exception e){System.out.println(e);}


    }

那么如何解决python无法在java中运行的问题 enter image description here

2 个答案:

答案 0 :(得分:2)

您的脚本已运行,但未达到“第2步”,因此

gUpdate.parse("BBCOntology.rdf" )

将成为问题的根源。可能是因为文件BBCOntology.rdf不在Python进程的当前工作目录中。或者可能是Python进程没有打开该文件的权限。

可能值得从Python进程读取错误流并在Java中打印出来。使用p.getErrorStream()的方式与使用p.getInputStream()的方式相同。

或者,更简单的是,在Python代码中添加一个异常处理程序,捕获并将异常消息打印到标准输出:

import traceback

try:
    gUpdate = Graph()
    print ".> Step....1"
    gUpdate.parse("BBCOntology.rdf" )
    print ".> Step....2"
    print gUpdate.serialize(format='xml')
    print ".>  Finished......."
except Exception as exc:
    traceback.print_exc()
    raise exc

然后,您的Java进程应该打印消息,这可能是提供信息的。

答案 1 :(得分:0)

gUpdate = Graph()
print ".> Step....1"
gUpdate.parse("D:\\Desktop\\searchTestJava\\BBCOntology.rdf" )
print ".> Step....2"       

BBCOntology.rdf位于Python进程的当前工作目录中。所以即使我写了(gUpdate.parse(" BBCOntology.rdf")),该程序也可以在python中工作。

但是,java不知道目录BBCOntology.rdf与TESTopenBaseOnt.py相同。 一旦我添加了gUpdate.parse(" D:\ Desktop \ searchTestJava \ BBCOntology.rdf"),Java就可以工作了。