我有一个print_dot()在stdout上输出点的函数.那样我可以这样做:
$ ./myprogram < input | dot -T x11
Run Code Online (Sandbox Code Playgroud)
当我尝试打印一个图形时它很有用.
现在当我打印几张图表时,什么都没有出现.点窗口为空白,X11和点占用所有CPU.stderr上没有打印任何内容.
$ echo -e "graph { a -- b }" | dot -T x11 # work
$ echo -e "graph { a -- b } \n graph { c --d }" | dot -T x11 # doesn't work
# it seems to be interpreted nonetheless
$ echo -e "graph { a -- b } \n graph { c -- d } " | dot -T xdot
graph {
...
}
graph {
...
}
Run Code Online (Sandbox Code Playgroud)
此外,当我删除\n2个图形之间时,只解释第一个图形(这是一个很好的特性......):
$ echo -e "graph { a -- b } graph { c -- d } " | dot -T xdot
graph {
...
}
Run Code Online (Sandbox Code Playgroud)
再次将xdot输出管道连接到点不能解决问题.
那么,如何使用graphviz渲染多个图形?
用 gvpack
$ echo -e "graph { a -- b }\ngraph { c -- d }" | gvpack -u | dot -Tpng > graphs.png
Run Code Online (Sandbox Code Playgroud)
结果
读取标准输入上的图形并打开多个点实例的简单脚本。
#!/usr/bin/perl
my $o;
my @l;
while(<>) {
if(/^\s*(di)?graph/) {
push @l, $o;
$o = '';
}
$o .= $_;
}
if($o =~ /graph/) {
push @l, $o;
}
for(@l) {
if(fork() == 0) {
open my $p, '| dot -T x11' or die $!;
print $p $_;
close $p;
exit 0;
}
}
Run Code Online (Sandbox Code Playgroud)