2017-01-22 2 views
-1

Я запускал сценарий Octave через классы ProcessBuilder и Process в Java. Я использовал Netbeans, и файл сценария находится в папке ресурсов проекта, который я делаю.Скрипт октавы через Netbeans 8.2 (Java Project) не создает файлы (редактирование: не работает вообще)

При запуске из bash скрипт работает нормально. Когда я запускаюсь с Java, я уверен, что скрипт работает нормально.

В программе ниже,

#!/usr/bin/octave -qf 
function ret = manipulateCell(x) 

    x = x/max(x(:)); 
    x = x.*255; 
    x = int32(x); 
    a1 = mean(x(:)); 

    ret = a1<70; 
end 

img = imread('aaa.png'); 
imgInd = rgb2ind(img); 
imgGray = ind2gray(imgInd,colormap()); 

sizeVector = 100*ones(1,20); 


Cells = mat2cell(imgGray,sizeVector,sizeVector); 

ManipCells = cellfun(@manipulateCell,Cells); 

file2D = fopen('data.txt','rw+'); 
dlmwrite(file2D,ManipCells); 

Последние две строки, кажется, не бежать от Netbeans; нет выхода (т. е. не создается выходной файл).

Код Java, который используется для запуска этого скрипта.

ProcessBuilder pb = new ProcessBuilder("src/resources/ProcessImg.m"); 
try{ 
    Process p = pb.start(); 
} 
catch(IOException ex){ 
    ex.printStackTrace(); 
} 

- Edit:

Я просто попытался imshow(img) между вышеприведенным кодом. Это тоже не сработало.


Edit:

Как проверить, что ProcessBuilder и процесс работы штраф? и как я знаю, в каком каталоге я нахожусь в.

String command = "pwd"; 
ProcessBuilder pb = new ProcessBuilder(command); 
     //pb.directory(new File("./")); 

     try{ 
     Process p = pb.start(); 

     //Debug Code 
     pb.redirectErrorStream(true); 
     BufferedReader bf = new BufferedReader(new InputStreamReader(p.getInputStream())); 

     String s; 

     while((s=bf.readLine())!=null){ 
      System.out.println(s); 
     } 

     p.getInputStream().close(); 
     p.getOutputStream().close(); 
     p.getErrorStream().close(); 
     } 
     catch(IOException ex){ 
      ex.printStackTrace(); 
     } 

Если command строка pwd, выход

/home/user/NetBeansProjects/Project 

Если command строка ls, выход

Я хочу сказать, что команды выполняются.

Кроме того, строитель процессов идентифицирует обозначения shebang.


Проблема заключается в NetBeans не позволяет ProcessImg.m создавать файлы в его каталоге с помощью внешнего процесса возможно.


#!/usr/bin/octave -qf 
function ret = manipulateCell(x) 

    x = x/max(x(:)); 
    x = x.*255; 
    x = int32(x); 
    a1 = mean(x(:)); 

    ret = a1<70; 
end 

img = imread('~/Desktop/aaa.png'); 

imgInd = rgb2ind(img); 
imgGray = ind2gray(imgInd,colormap()); 

sizeVector = 100*ones(1,20); 


Cells = mat2cell(imgGray,sizeVector,sizeVector); 

ManipCells = cellfun(@manipulateCell,Cells); 

file2D = fopen('~/Desktop/data.txt','rw+'); 
dlmwrite(file2D,ManipCells); 

Я поставил абсолютный путь (от дома), как предложено, и это не сработало. Не только в NetBeans файл не был создан, но также и на рабочем столе.

+0

предоставьте полный MCVE. Из приведенного выше кода вы, например, пропустите fclose ... – Andy

+0

Вы пытались указать * полный путь к файлу *, а не просто 'data.txt'? – Suever

+0

@ Andy Я не предоставил fclose, но запуск скрипта из bash дает мне результат. –

ответ

0

Я уверен, что «ProcessBuilder» не понимает хижину в сценарии (или вы не установили его исполняемый файл), и вы должны назвать его как

ProcessBuilder pb = new ProcessBuilder("/usr/bin/octave", 
             "src/resources/ProcessImg.m"); 

Но это выглядит общая проблема, поэтому я предлагаю искать «ProcessBuilder execute bash script» (или perl-скрипт), который дает много хитов.

Также попробуйте абсолютный путь к вашему сценарию и явно закрывайте файл при выходе.

+0

Я проверил его за пределами netbeans, вручную выполнив ProcessBuilder и Process. Я не изменял код или разрешения. Он работал нормально. –

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