2016-10-05 1 views
0

Я использую java для создания ProcessBuilder для запуска python.процесс Builder java не может запустить некоторый код python в java. Как решить?

Обе из них могут быть успешно запущены в программе python. (Два пе не имеют проблем с кодом)

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......." 
# 

AS вы можете увидеть изображение.

код работает для питона: input.py Однако, это не работает для питона: TESTopenBaseOnt.py
Это может быть потому, что Java не может запустить функцию разбора в питона. как результат показывает, что программа остановилась на шаге 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);} 


    } 

Так как решить эту проблему, что питон не может работать в Java enter image description here

+1

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

+0

Большое спасибо. Я получил идею – HiPownedBi

ответ

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

+0

Спасибо большое! Я получил идею – HiPownedBi

0
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: \ Desktop \ searchTestJava \ BBCOntology.rdf"), Java может работать.

Смежные вопросы