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

Posted

技术标签:

【中文标题】一些 GNUPlot 终端从命令行工作,但从 Perl 调用时不能(管道)【英文标题】:Some GNUPlot terminals work from command line, but not when called from Perl (piping) 【发布时间】:2013-02-05 06:04:22 【问题描述】:

我正在使用 Perl 编写一个 CGI 程序,按照此处将输入管道输入到 Gnuplot:

how to call a gnuplot script from perl

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

其次,在执行完第一个测试后,我尝试将相同的“字符串”(粗略地说)从 .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 上运行“设置终端”表明 cairolatex 是一个有效的终端。

【问题讨论】:

能否请您发布一些演示该问题的代码? 【参考方案1】:

您可能想为此尝试CPAN module,我碰巧知道这比您想象的要难。

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

【讨论】:

以上是关于一些 GNUPlot 终端从命令行工作,但从 Perl 调用时不能(管道)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ssh 从 crontab 失败但从命令行执行时成功?

sh:gnuplot:在 Gnuplot + Xcode 中找不到命令

Maven 命令 mvn 从终端运行没有错误,但从 python 运行没有错误

当 Python 3.5.2 调用 gsutil rsync 时返回错误,但从命令行可以

Eigen 程序无法从 Visual Studio 编译,但从命令行编译成功

从测试视图运行时测试成功,但从测试列表编辑器或命令行运行时失败