我有一个python脚本,经过一些计算后会生成两个格式为gnuplot输入的数据文件.
我如何从python'调用'gnuplot?
我想将以下python字符串作为输入发送到gnuplot:
"plot '%s' with lines, '%s' with points;" % (eout,nout)
Run Code Online (Sandbox Code Playgroud)
其中" EOUT "和" NOUT "是两个文件名.
PS:我宁愿不使用额外的Python模块,只有标准的API(例如gnuplot的-PY).
谢谢
sth*_*sth 23
该subprocess模块允许您调用其他程序:
import subprocess
plot = subprocess.Popen(['gnuplot'], stdin=subprocess.PIPE)
plot.communicate("plot '%s' with lines, '%s' with points;" % (eout,nout))
Run Code Online (Sandbox Code Playgroud)
小智 16
在Doug Hellemann的本周Python模块中非常清楚地解释了子流程
这很好用:
import subprocess
proc = subprocess.Popen(['gnuplot','-p'],
shell=True,
stdin=subprocess.PIPE,
)
proc.stdin.write('set xrange [0:10]; set yrange [-2:2]\n')
proc.stdin.write('plot sin(x)\n')
proc.stdin.write('quit\n') #close the gnuplot window
Run Code Online (Sandbox Code Playgroud)
也可以使用"通信",但绘图窗口会立即关闭,除非使用gnuplot pause命令
proc.communicate("""
set xrange [0:10]; set yrange [-2:2]
plot sin(x)
pause 4
""")
Run Code Online (Sandbox Code Playgroud)
一个简单的方法可能是编写包含gnuplot命令的第三个文件,然后告诉Python使用该文件执行gnuplot.说你写
"plot '%s' with lines, '%s' with points;" % (eout,nout)
Run Code Online (Sandbox Code Playgroud)
到一个名为tmp.gp的文件.然后你可以使用
from os import system, remove
system('gnuplot tmp.gp')
remove('tmp.gp')
Run Code Online (Sandbox Code Playgroud)
小智 5
我试图做类似的事情,但另外我想从python中提供数据并输出图形文件作为变量(因此数据和图形都不是实际文件).这就是我想出的:
#! /usr/bin/env python
import subprocess
from sys import stdout, stderr
from os import linesep as nl
def gnuplot_ExecuteCommands(commands, data):
args = ["gnuplot", "-e", (";".join([str(c) for c in commands]))]
program = subprocess.Popen(\
args, \
stdin=subprocess.PIPE, \
stdout=subprocess.PIPE, \
stderr=subprocess.PIPE, \
)
for line in data:
program.stdin.write(str(line)+nl)
return program
def gnuplot_GifTest():
commands = [\
"set datafile separator ','",\
"set terminal gif",\
"set output",\
"plot '-' using 1:2 with linespoints, '' using 1:2 with linespoints",\
]
data = [\
"1,1",\
"2,2",\
"3,5",\
"4,2",\
"5,1",\
"e",\
"1,5",\
"2,4",\
"3,1",\
"4,4",\
"5,5",\
"e",\
]
return (commands, data)
if __name__=="__main__":
(commands, data) = gnuplot_GifTest()
plotProg = gnuplot_ExecuteCommands(commands, data)
(out, err) = (plotProg.stdout, plotProg.stderr)
stdout.write(out.read())
Run Code Online (Sandbox Code Playgroud)
该脚本将图形转储到stdout作为main的最后一步.等效的命令行(图形通过管道输出到'out.gif')将是:
gnuplot -e "set datafile separator ','; set terminal gif; set output; plot '-' using 1:2 with linespoints, '' using 1:2 with linespoints" > out.gif
1,1
2,2
3,5
4,2
5,1
e
1,5
2,4
3,1
4,4
5,5
e
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
41589 次 |
| 最近记录: |