Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python子流程:如何通过管道向gnuplot发送命令来绘制变量?_Python_Escaping_Subprocess_String Formatting_Gnuplot - Fatal编程技术网

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脚本。可悲的是,我一直在寻找一个快速而肮脏的解决方案,但似乎这终究不会这么简单。