2011-07-26 14 views
1

ここでは何もやろうとしていません。私は次のスクリプトでいくつかの実験データをプロットしようとしています:Pythonのサブプロセス: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()) 
     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:警告:「読めないファイルをスキップ」%ファイル名「」 行0:プロット

私はすでにSYSからファイル名を解析されてきた

にデータなし。 argvを作成し、それが正しいことと安全であることを確認し、gnuplotにファイル名が設定されている名前をプロットするように指示する必要があります。 エスケープ文字を使用しようとしましたが、アンバーサンを削除しましたが、私は明らかに間違った構文を使用しています。

誰かが助けてくれますか?

編集:私はPythonの整形の問題を解決してきましたAGFする

感謝の:

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" 

しかし、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 

私はそれが関係している賭けているが、\改行文字?

+2

これはまだ手に入りませんが、ここで見てみてください:http://gnuplot-py.sourceforge.net/ –

答えて

5

あなたは

gnuplot.write("plot %s using 1 with lines lt -1 lw 0.5 title 'X axis' \n " % filename1) 

をしたいが、あなたがやろうとしていたもののように見えた、新しいスタイルの書式設定や古いスタイルの書式設定のためのhttp://docs.python.org/library/stdtypes.html#string-formattingためhttp://docs.python.org/library/string.html#formatstringsを参照してください。

編集2:私はwisoの提案の一部も好きです。 gnuplotのコマンドをファイルに保存し(変数に書式を設定する必要があります)、Pythonでそのファイルを読み込んでフォーマットします。これはgnuplotのものを分けているので、引用や行末を心配する必要はありません。

あなたはコマンドの多くを送信したい場合は、私は、(好ましくはfile.readlines()とそれらをファイルから読み込むことによって)リスト内のすべての文字列を入れて書いてみたい:

for line in lines: 
    gnuplot.write(lines) 
    gnuplot.flush() 

だから、それが送信されます一度に1つの行を指定しますが、特定の番号をハードコードする必要はありません。

+0

gnuplotに一度に多くの行を送信する方法も知りませんか? gnuplotでは、私は通常各データを送信し、それは行ごとにパラメータであり、\で終わりますが、ここではうまくいかないようです。 –

+0

暗黙の文字列連結で試してみてください。 – agf

+0

助けてくれてありがとう、悲しいことにこれは助けにもならなかった。問題はpythonではなく、gnuplot側にあります。 –

1

agfが述べたように、問題は文字列をどのようにフォーマットするかということです。代わりに、書式設定が通常より良い場合でも、+演算子を使用して文字列を連結することができます。

一般に私はgnuplotコードをPythonコードに分けるべきだと思います。

gnuplotコードplot.gpには、データの描画方法を記述します。あなたのpythonスクリプトを使用して、データを生成し、ファイルに、たとえばtemp fileのようなタブ形式で書き込みます。次に、ファイルからgnuplotスクリプトの読み取りを実行します(例:hereを参照)。

+0

あるいは、Pythonがファイルからgnuplot命令を読み込み、文字列フォーマットを使用して変数を削除するようにしてください。これにより、データを書き出しなくてもgnuplotスクリプトを別々に実行する必要がなくなります。 – agf

+0

両方のアドバイスをありがとう、私はそれを調べます。悲しいことに、私は速くて汚い解決策を探していましたが、結局のところ単純すぎるとは思われません。 –

関連する問題