2017-01-22 7 views
-1

JavaのProcessBuilderとProcessクラスでOctaveスクリプトを実行しました。私はNetbeansを使用して、スクリプトファイルは私がやっているプロジェクトのリソースフォルダにあります。Netbeans 8.2(Java Project)で実行されているOctaveスクリプトがファイルを作成していません(編集:全く実行していません)

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); 

最後の2行は、NetBeansから実行していないように見えます。出力がない(すなわち、出力ファイルが作成されない)。

このスクリプトを実行するために使用されるJavaコード。

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

- 編集:

私は上記のコードの間でimshow(img)を試してみました。それはどちらもうまくいかなかった。


編集:私はその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ある場合command文字列がlsの場合、出力は、出力が

/home/user/NetBeansProjects/Project 

です

コマンドが実行されているとします。

また、プロセスビルダーはシバン表記を識別しています。


問題点は、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

私は、ProcessBuilderとProcessを手動で実行してネットビーンの外側でテストしました。私はコードやパーミッションを変更しませんでした。それは正常に働いた。 –

関連する問題