2016-12-12 8 views
0

"gnuplot"プロセスを実行してopen2でコマンドを送信しようとしていますが、何も起こりません。私はperlで新しいので、私はちょっとしたことがうまくいくと思いますが、このモジュールに関する公式文書は私には分かりません。Perl、open2、stdinは動作しません

use IPC::Open2; 
use strict; 
use warnings; 

my($w, $r); 

my $pid = open2($w, $r, "gnuplot") or die "$!"; 
# print "pid was $pid\n"; 
print $w "reset\n"; 
print $w "dx=5.\n"; 
print $w "n=2\n"; 
print $w "total_box_width_relative=0.75\n"; 
print $w "gap_width_relative=0.1\n"; 
print $w "d_width=(gap_width_relative+total_box_width_relative)*dx/2.\n"; 
print $w "reset\n"; 
print $w "set term png truecolor font 'arial,10' fontscale 1.0 size 800, 400\n"; 
print $w "set output 'test.png'\n"; 
print $w "set xlabel 'time' offset '0', '-2'\n"; 
print $w "set ylabel 'load'\n"; 
print $w "set autoscale xfixmin\n"; 
print $w "set autoscale xfixmax\n"; 
print $w "set autoscale y\n"; 
print $w "set datafile separator '\\t'\n"; 
print $w "set xdata time\n"; 
print $w "set timefmt '%d-%m-%Y'\n"; 
print $w "set xrange ['08-12-2016':'23-02-2025']\n"; 
print $w "set format x '%m/%d/%Y'\n"; 
print $w "set xtic rotate by 30 offset character -4,-2\n"; 
print $w "set xtics font ', 8'\n"; 
print $w "set grid\n"; 
print $w "set boxwidth total_box_width_relative/n relative\n"; 
print $w "set style fill transparent solid 0.5 noborder\n"; 
print $w "plot 'test.dat' u 1:2 w boxes lc rgb'blue' notitle,\\\n"; 
print $w " 'test.dat' u 1:3 w boxes lc rgb'red' notitle\n"; 
close($w); 
waitpid($pid, 0); 
if ($?) { 
    print "That child exited with wait status of $?\n"; 
} 

TEST.DAT構造例:

08-12-2016 3 6 
09-12-2016 56 44 

私が間違って何をしているのですか?

答えて

2

私はあなたがファイルの順序はopen2に周りに間違った方法を扱う持っているかなり確信している:例えば

$pid = open2($chld_out, $chld_in, 'some', 'cmd', 'and', 'args'); 

あなたの例の$wはプロセスのためにSTDOUTであるため、それに印刷することは全く何もしません。 waitpidを実行していて、 '出力'ファイルハンドルを閉じるので、プロセスは入力ファイルハンドルから読み込み中であるため、無期限に待つことになります。

私はまた、本当に強く1文字の変数名がとにかく悪い考えであることをお勧めします。あなたはそう、あまりにもopen2文でmyを埋め込むことができます。

my $pid = open2 (my $child_out, my $child_in, "gnuplot"); 

とマイナースタイルのポイントのカップルのように - 私は何度もprint $wを複製することは実際にそれを行うための理想的な方法ではないことをお勧めしたいです。

についてどのように

#!/usr/bin/env perl 
use strict; 
use warnings; 

use IPC::Open2; 
use IO::Select; 

my $pid = open2(my $gnuplot_out, my $gnuplot_in, "gnuplot"); 
my $select = IO::Select->new($gnuplot_out); 

while (my $command = <DATA>) { 
    print {$gnuplot_in} $command; 
    while ($select->can_read(0)) { 
     print "Response from gnuplot: ", scalar <$gnuplot_out>, "\n"; 
    } 
} 

close($gnuplot_in); 
while ($select->can_read(0)) { 
    print "Response from gnuplot: ", scalar <$gnuplot_out>, "\n"; 
} 

close($gnuplot_out); 
waitpid($pid, 0); 
if ($?) { 
    print "That child exited with wait status of $?\n"; 
} 

__DATA__ 
reset 
dx=5. 
n=2 
total_box_width_relative=0.75 
gap_width_relative=0.1 
d_width=(gap_width_relative+total_box_width_relative)*dx/2. 
reset 
set term png truecolor font 'arial,10' fontscale 1.0 size 800, 400 
set output 'test.png' 
set xlabel 'time' offset '0', '-2' 
set ylabel 'load' 
set autoscale xfixmin 
set autoscale xfixmax 
set autoscale y 
set datafile separator '\\t' 
set xdata time 
set timefmt '%d-%m-%Y' 
set xrange ['08-12-2016':'23-02-2025'] 
set format x '%m/%d/%Y' 
set xtic rotate by 30 offset character -4,-2 
set xtics font ', 8' 
set grid 
set boxwidth total_box_width_relative/n relative 
set style fill transparent solid 0.5 noborder 
plot 'test.dat' u 1:2 w boxes lc rgb'blue' notitle,\\ 
    'test.dat' u 1:3 w boxes lc rgb'red' notitle 
+0

ああ、おかげで、それは少し近いですが、gnuplotのエラーが応答しているが、それでも、スクリプトが起動し、何もしません。私ができる唯一のことは手動のctrl + c割り込みですが、それでもいくつかのgnuplotデーモンはメモリに残っていて、cmdはダイアログウィンドウで閉じています。 "本当にプロセスを終了しますか?" – genesi5

+0

gnuplotコマンドの最後に 'exit'を追加することはできますか? – Sobrique

+0

gnuplotのように "プロット"行が好きではないようですが、どのような方法でも(スラッシュ、スラッシュ、onelinerなど)、.plファイルでのみ試みました。 gnuplotで同じコードを実行すると、すべて正常です。 – genesi5

関連する問題