Gnuplot 从 Python 发送换行和 "\",\
通常在使用gnuplot时,我会这样做:
gnuplot> plot "state_log_6548032.data" using 4 with lines lt -1 lw 0.5 title "X axis" ,\
>"state_log_6548032.data" using 5 with lines lt 1 lw 0.5 title "Y axis" ,\
>"state_log_6548032.data" using 6 with lines lt 2 lw 0.5 title "Z axis"
但是当我尝试通过python使用子进程来做同样的事情时:
gnuplot.write( "plot \"%s\" using 1 with lines lt -1 lw 0.5 title 'X axis' ,\ \n" %filename )
gnuplot.write( "plot \"%s\" using 2 with lines lt 1 lw 0.5 title 'Y axis' ,\ \n" %filename )
gnuplot.write( "plot \"%s\" using 3 with lines lt 2 lw 0.5 title 'Z axis' \n" %filename )
我遇到了以下错误:
gnuplot> plot "state_log_6548032.data" using 1 with lines lt -1 lw 0.5 title 'X axis' ,\
^
line 0: invalid character \
gnuplot> plot "state_log_6548032.data" using 2 with lines lt 1 lw 0.5 title 'Y axis' ,\
^
line 0: invalid character \
我花了不少时间试图搞清楚这是不是python的问题,但我发现其实是gnuplot的问题。因为在控制台调用时,gnuplot出于某种原因需要使用转义字符,但在我的情况下并不需要。不过我的问题依然存在。我该如何从python的子进程中通过管道传递指令,或者通过python创建一个gnu文件,然后调用gnuplot的子进程来使用这个文件,从而绘制上面的数据呢?
补充:
对于任何可能在这个简单问题上卡住的人:正如下面那些热心人所解释的,当你在python中使用“\”时,python会对它进行转义。所以解决办法其实很简单:
gnuplot.write( "plot \"%s\" using 1 with lines lt -1 lw 0.5 title 'X axis' ,\\\n" %filename )
gnuplot.write( "\"%s\" using 2 with lines lt 1 lw 0.5 title 'Y axis' ,\\\n" %filename )
gnuplot.write( "\"%s\" using 3 with lines lt 2 lw 0.5 title 'Z axis' \n" %filename )
4 个回答
如果你想在gnuplot中输入一个字面上的反斜杠,可以在Python字符串中使用\\
(就像你用\n
来输入一个换行符一样)。一般来说,\
是用来开始转义序列的,而在你的情况中,\
没有特别的含义,所以它就被当作一个空格处理了(也就是说,反斜杠被忽略了)。
你可以通过print
来测试你的字符串内容,而不是直接把它们传给gnuplot.write
。
不过,实际上你可以把所有内容放在一行里,而不是把反斜杠和换行符一个个传给gnuplot。
我觉得在Python里,当你输入 \
(反斜杠加空格)时,是在告诉程序忽略那个空格。而在gnuplot里,当你输入 \
然后按回车键时,是在告诉程序忽略换行符。
你有没有试过在结尾加上 ,\n
,这是Python里用来忽略换行的写法?或者只用 ,
或 ,
(逗号加空格)?或者只用 \n
?
其实,如果你需要忽略换行符,那可能并不是很必要,单纯用 ,
就可以用来分隔命令了。
在你发的命令行 gnuplot 示例中,你使用了换行符转义,这样可以避免在屏幕上出现很长的一行,但仍然把数据作为一整行发送给 gnuplot。
如果你是手动输入数据,这样做挺好的,但如果是通过程序来处理,为什么要在意呢?直接发送一整行就行了,Python 不会因为可读性而抱怨的 :)。如果你想知道问题出在哪里,那是因为 Python 也使用 \
作为转义符,所以这个字符根本没能到达 gnuplot
。
不过,有一些 python-gnuplot 的库可以帮你处理这些麻烦的事情。可以去看看!