Подпроцесс Python: как передать gnuplot команду для построения переменной? - PullRequest
1 голос
/ 27 июля 2011

Я не пытаюсь сделать здесь что-нибудь необычное.Я пытаюсь автоматизировать построение некоторых экспериментальных данных в следующем сценарии:

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 для отображения любого имени, для которого установлено имя файла.Я пытался использовать escape-символы, удаляя янтарь и, но я, очевидно, использую неправильный синтаксис.

Может кто-нибудь помочь?

РЕДАКТИРОВАТЬ:

Спасибо agf IЯ решил проблему с форматированием 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

Держу пари, что это должно сделатьс символом, \ и символом новой строки?

Ответы [ 2 ]

5 голосов
/ 27 июля 2011

Вы хотите

    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#formatstrings для форматирования нового стиля и http://docs.python.org/library/stdtypes.html#string-formatting для форматирования старого стиля, который выглядит как то, что вы пытались сделать.

Редактировать 2: Мне тоже нравится предложение Висо.Сохраните команды gnuplot в файле (с кодами формата для переменных, которые вам нужно добавить), затем просто прочитайте этот файл с помощью Python и отформатируйте его.Это разделяет материал gnuplot, и вам не нужно беспокоиться о кавычках или окончаниях строк.

Если вы хотите отправить много команд, я бы попытался написать, поместив все строки в список (предпочтительночитая их из файла с помощью file.readlines()), затем:

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

Таким образом, он отправляет строки по одной за раз, но вам не нужно жестко кодировать определенное число.

1 голос
/ 27 июля 2011

Как сказал agf, проблема в том, как вы форматируете свою строку.В качестве альтернативы вы можете объединить строку с помощью оператора +, даже если форматирование обычно лучше.

В общем, я думаю, вам следует отделить код gnuplot от кода python.plot.gp поставить, как данные должны быть нарисованы.Используйте ваш скрипт на python для генерации данных и записи их в виде таблицы в файл, например, в временный файл .Затем запустите чтение сценария gnuplot из файла, см., Например, здесь .

...