#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 может работать.