2011-07-26 2 views
1

나는 여기에서 아무것도 공상적인 것을하려고 노력하지 않고있다. 나는 다음과 같은 스크립트에서 몇 가지 실험 데이터를 플로팅 자동화하기 위해 노력하고 있습니다 :파이썬 하위 프로세스 : 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에게 파일 이름이 설정된 모든 이름을 그려 볼 필요가있다. 나는 앰퍼샌드를 제거하면서 이스케이프 문자를 사용해 보았지만 분명히 잘못된 구문을 사용하고 있습니다.

누군가 도와 드릴 수 있습니까?

편집 :

감사의 내가 파이썬 형식화하는 문제를 해결했습니다 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/string.html#formatstringshttp://docs.python.org/library/stdtypes.html#string-formatting를 참조합니다.

편집 2 : 나도 wiso의 제안을 좋아합니다. gnuplot 명령을 파일에 저장하고 (드롭 인해야 할 변수의 형식 코드 포함), Python으로 파일을 읽고 형식을 지정합니다. 이렇게하면 gnuplot이 분리되어 따옴표 나 줄 끝을 걱정할 필요가 없습니다.

당신이 명령을 많이 보내려면, 그때 쓰기 (file.readlines()와 파일을 읽어 바람직) 목록에있는 모든 문자열을 넣어 시도 할 것 : 그래서 보내지

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

을 한 번에 한 줄씩 있지만 특정 숫자를 하드 코드 할 필요는 없습니다.

+0

gnuplot에 여러 줄을 한 번에 보내는 방법을 알지도 못합니까? gnuplot에서 나는 보통 각 데이터를 보내고 줄마다 매개 변수를 쓰고 \로 끝나지 만, 여기서는 작동하지 않습니다. –

+0

암시 적 문자열 연결로 시도하십시오. – agf

+0

도움을 주셔서 감사합니다. 안타깝게도 도움이되지 않았습니다. 문제는 파이썬이 아닌 gnuplot 쪽입니다. –

1

agf가 말한 것처럼 문제는 문자열 형식을 지정하는 방법입니다. 또는 형식이 보통 더 나은 경우에도 + 연산자를 사용하여 문자열을 연결할 수 있습니다.

일반적으로 gnuplot 코드를 파이썬 코드와 구분해야한다고 생각합니다.

gnuplot 코드 plot.gp에서 데이터를 가져 오는 방법을 지정하십시오.파이썬 스크립트를 사용하여 데이터를 생성하고이를 파일 형식 (예 : temp file)으로 작성하십시오. 그런 다음 파일에서 gnuplot 스크립트 읽기를 실행하십시오 (예 : here 참조).

+0

아니면 파이썬에서 파일의 gnuplot 명령을 읽고 문자열 형식을 사용하여 변수를 삭제하십시오. 이렇게하면 데이터를 쓰지 않고 별도로 gnuplot 스크립트를 실행할 필요없이 작업을 분리 할 수 ​​있습니다. – agf

+0

조언을 주셔서 감사합니다. 슬프게도 빠르고 더러운 해결책을 찾고 있었지만, 결국 그렇게 간단하지는 않습니다. –