一些GNUPlot终端从命令行工作,但不是从Perl(管道)调用时

时间:2013-02-05 06:04:23

标签: perl cgi pipe gnuplot

我正在使用Perl编写一个CGI程序,根据此处将输入传递给Gnuplot:

how to call a gnuplot script from perl

首先,我通过编写.gnu文件并在bash终端中使用gnuplot执行它来测试我的所有gnuplot绘图例程。我尝试了许多不同的gnuplot终端和相应的输出格式(“set terminal ...,set output ...”),这总是有效。

其次,在执行第一次测试之后,我尝试将.gnu文件中的相同“字符串”(粗略地说)从perl脚本传递到gnuplot。我已多次检查以确保该字符串已正确转义字符。这适用于epslatex终端,但它不适用于png,gif,pdf,jpeg,cairolatex或pdfcairo终端,尽管所有这些终端类型都适用于我的第一个测试用例。我的意思是“不起作用”是在Perl CGI中使用这些终端会生成一个输出名称的文件,但它的大小为0kB。

我怀疑冲洗管道可能有问题,类似于:

Why doesn't my parent process see the child's output until it exits?

但是在用gnuplot传送的字符串末尾添加一个换行符,然后打开autoflush($ | = 1)并没有解决问题。

我很难过。知道可能会发生什么吗?

编辑:以下是示例代码:

工作:

open my $GP, '|-', 'gnuplot';  
my $GPoutput = "set xrange [-5:5]  
set terminal epslatex  
set output \"graph1.tex\  
plot sin(x)";  
$|=1;  
print $GP "$GPoutput";

不起作用:

open my $GP, '|-', 'gnuplot';  
my $GPoutput = "set xrange [-5:5]  
set terminal cairolatex  
set output \"graph1.tex\  
plot sin(x)";  
$|=1;  
print $GP "$GPoutput";

虽然如果我将$ GPoutput的字符串放入.gnu文件并从命令行执行gnuplot,它确实有效,并且在gnuplot上运行“set terminal”表明cairolatex是一个有效的终端。

1 个答案:

答案 0 :(得分:0)

你可能想尝试CPAN module,我碰巧知道它比你想象的更难。

我熟悉的是PDL (The Perl Data Language)PDL::Graphics::Gnuplot扩展名。