一些 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 时返回错误,但从命令行可以