【问题标题】:process Builder java cannot run some of the python code in java. How to solve?process Builder java无法运行java中的一些python代码。怎么解决?
【发布时间】:2016-10-05 10:26:01
【问题描述】:

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

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

输入.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 函数。结果表明,程序在step1处停止。

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中运行的问题

【问题讨论】:

  • 也许你的 py 脚本找不到你的 BBCOntology.rdf 文件,因为 processbuilder 在不同的目录中运行脚本。在解析行中尝试绝对路径
  • 非常感谢。我明白了

标签: java python parsing rdf processbuilder


【解决方案1】:

你的脚本运行了,但没有达到“第 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 进程应该会打印消息,这可能会提供信息。

【讨论】:

  • 非常感谢!我明白了
【解决方案2】:
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 就可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多