process Builder java не может запустить часть кода python на Java. Как решить?

#java #python #parsing #rdf #processbuilder

#java #python #синтаксический анализ #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. как показывает результат, программа остановилась на шаге 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
введите описание изображения здесь

Комментарии:

1. Возможно, ваш скрипт py не может найти ваш файл BBCOntology.rdf, потому что processbuilder запускает скрипт в другом каталоге. Попробуйте указать абсолютный путь в строке синтаксического анализа

2. Большое спасибо. У меня появилась идея

Ответ №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-процесс должен напечатать сообщение, которое может быть информативным.

Комментарии:

1. Большое спасибо! У меня появилась идея

Ответ №2:

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

Файл BBCOntology.rdf находится в текущем рабочем каталоге процесса Python. Таким образом, программа может работать на python, даже если я написал как (gUpdate.parse(«BBCOntology.rdf» ) ) .

Однако java не знает, что каталог BBCOntology.rdf такой же, как TESTopenBaseOnt.py . Как только я добавлю gUpdate.parse(«D:DesktopsearchTestJavaBBCOntology.rdf » ), Java может работать.