Python子流程:如何通过管道向gnuplot发送命令来绘制变量?
我不想在这里做任何花哨的事。我尝试在以下脚本中自动绘制一些实验数据:Python子流程:如何通过管道向gnuplot发送命令来绘制变量?,python,escaping,subprocess,string-formatting,gnuplot,Python,Escaping,Subprocess,String Formatting,Gnuplot,我不想在这里做任何花哨的事。我尝试在以下脚本中自动绘制一些实验数据: print "processing: ", filename gnuplot = Popen(gnuplot_bin,stdin = PIPE).stdin if state_plot: gnuplot.write( "set term x11\n".encode()) gnuplot.write( "set term png size 1920,1010 \n".encode() )
print "processing: ", filename
gnuplot = Popen(gnuplot_bin,stdin = PIPE).stdin
if state_plot:
gnuplot.write( "set term x11\n".encode())
gnuplot.write( "set term png size 1920,1010 \n".encode() )
gnuplot.write( "set output \"acceleration.png\" \n".encode() )
gnuplot.write( "set xlabel \"timesteps\" \n".encode() )
gnuplot.write( "set ylabel \"acceleration\" \n".encode() )
gnuplot.write( "plot " %filename " using 1 with lines lt -1 lw 0.5 title 'X axis' \n " .encode() )
gnuplot.write( " " %filename " using 2 with lines lt 1 lw 0.5 title 'Y axis' \n " .encode() )
gnuplot.write( " " %filename " using 3 with lines lt 2 lw 0.5 title 'Z axis' \n " .encode() )
然而,文件名是字面意思。我从gnuplot获得以下错误:
第0行:警告:跳过不可读的文件“%filename”
第0行:绘图中没有数据
我已经从sys.argv解析了文件名,并确保它是正确和安全的,现在我需要告诉gnuplot打印文件名设置为的任何名称。
我尝试过使用转义字符,删除ambersand,但我显然使用了错误的语法
有人能帮忙吗
编辑:
感谢agf,我已经解决了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 )
但是现在我对gnuplot有一个问题。通常,当直接使用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似乎会导致错误:
gnuplot> plot "state_log_6548032.data" using 1 with lines lt -1 lw 0.5 title 'X axis' ,\
^
line 0: invalid character \
gnuplot> "state_log_6548032.data" using 2 with lines lt 1 lw 0.5 title 'Y axis' ,\
^
line 0: invalid character \
gnuplot> "state_log_6548032.data" using 3 with lines lt 2 lw 0.5 title 'Z axis'
^
line 0: invalid command
我敢打赌这和\和换行符有关?你想要的
gnuplot.write("plot %s using 1 with lines lt -1 lw 0.5 title 'X axis' \n " % filename1)
有关新样式格式和旧样式格式的信息,请参见,这与您尝试执行的操作类似
编辑2:我也喜欢wiso的部分建议。将gnuplot命令保存在一个文件中(带有需要放入的变量的格式代码),然后用Python读取该文件并格式化它。这分离了gnuplot的内容,您不需要担心引用或行尾
如果您想发送大量命令,我会尝试将所有字符串写入一个列表(最好通过使用file.readlines()
)从文件中读取它们),然后:
因此,它一次发送一行,但您不必硬编码特定的数字。您需要
gnuplot.write("plot %s using 1 with lines lt -1 lw 0.5 title 'X axis' \n " % filename1)
有关新样式格式和旧样式格式的信息,请参见,这与您尝试执行的操作类似
编辑2:我也喜欢wiso的部分建议。将gnuplot命令保存在一个文件中(带有需要放入的变量的格式代码),然后用Python读取该文件并格式化它。这分离了gnuplot的内容,您不需要担心引用或行尾
如果您想发送大量命令,我会尝试将所有字符串写入一个列表(最好通过使用file.readlines()
)从文件中读取它们),然后:
因此,它一次发送一行,但您不必硬编码特定的数字。正如agf所说,问题在于如何格式化字符串。或者,您可以使用
+
运算符连接字符串,即使格式通常更好
一般来说,我认为应该将gnuplot代码与python代码分开
在gnuplot code
plot.gp
中,输入应该如何绘制数据。使用python脚本生成数据,并将其以tabual格式写入文件,例如在文件中。然后运行gnuplot脚本读取文件,请参见示例。正如agf所说,问题在于如何格式化字符串。或者,您可以使用+
运算符连接字符串,即使格式通常更好
一般来说,我认为应该将gnuplot代码与python代码分开
在gnuplot code
plot.gp
中,输入应该如何绘制数据。使用python脚本生成数据,并将其以tabual格式写入文件,例如在文件中。然后运行gnuplot脚本读取文件,例如,请参见。它还没有被覆盖,但请尝试在此处查看:它还没有被覆盖,但请尝试在此处查看:您不会碰巧知道如何一次向gnuplot发送多行?在gnuplot中,我通常发送每行的每个数据及其参数,以\结尾,但这里似乎不起作用。请尝试隐式字符串连接。感谢您的帮助,遗憾的是,这也没有帮助。问题出在gnuplot端,而不是python。如何在行上循环,并在行之间刷新缓冲区?将尝试编辑:您的解决方案更干净,将命令循环并放置在文件中,我将不得不这样做,因为有比上面发布的命令多得多的命令。然而,我不断得到的错误似乎源于“,\”部分。我不知道的是为什么我必须首先在控制台中发送“,\”。同样在控制台中,我发送“,\ENTER”,所以我猜它实际上是一个“,\n”?这似乎是造成我的错误的原因。你不知道如何同时向gnuplot发送多行代码吗?在gnuplot中,我通常发送每行的每个数据及其参数,以\结尾,但这里似乎不起作用。请尝试隐式字符串连接。感谢您的帮助,遗憾的是,这也没有帮助。问题出在gnuplot端,而不是python。如何在行上循环,并在行之间刷新缓冲区?将尝试编辑:您的解决方案更干净,将命令循环并放置在文件中,我将不得不这样做,因为有比上面发布的命令多得多的命令。然而,我不断得到的错误似乎源于“,\”部分。我不知道的是为什么我必须首先在控制台中发送“,\”。同样在控制台中,我发送“,\ENTER”,所以我猜它实际上是一个“,\n”?这似乎导致了我的错误,或者让Python从文件中读取gnuplot指令,并使用字符串格式插入变量。这样就可以将事情分开,而不必写出数据并单独运行gnuplot脚本。遗憾的是,我一直在寻找一个快速而肮脏的解决方案,但看起来这终究不会这么简单。或者让Python从文件中读取gnuplot指令,并使用字符串格式插入变量。这样就可以将事情分开,而不必写出数据并单独运行gnuplot脚本。可悲的是,我一直在寻找一个快速而肮脏的解决方案,但似乎这终究不会这么简单。