Выполнение пакета xmgrace с помощью subprocess.Popen()

Мне приходится делать графики из нескольких файлов с данными. Я уже нашел способ запустить простую команду

xmgrace -batch batch.bfile -nosafe -hardcopy

в котором batch.bfile представляет собой текстовый файл с командами благодати для печати графика, который я хочу. Я уже пробовал это вручную, и это работает отлично. Чтобы сделать это с несколькими файлами, мне просто нужно отредактировать один параметр внутри batch.bfile и запускать одну и ту же команду каждый раз, когда я вношу изменения.

Я уже написал код Python, который редактирует файл batch.b и просматривает все файлы данных с помощью цикла for. На каждом шаге цикла я хочу запускать указанную команду прямо в командной строке.

Немного поискав, я нашел два решения: одно с os.system(), а другое с subprocess.Popen(), и я смог заставить работать только subprocess.Popen() без каких-либо ошибок, написав:

subprocess.Popen("xmgrace -batch batch.bfile -nosafe -hardcopy", shell=True)

Проблема в том, что на практике это ничего не делает, то есть это просто не то же самое, что запуск команды непосредственно в командной строке. Я уже пытался написать полный каталог для файла batch.b, но ничего не изменилось.

Я использую Python 2.7 и Mac OS 10.7.


person operte    schedule 25.07.2011    source источник
comment
Ничего не изменилось, как в nothign вернули или распечатали?   -  person thabubble    schedule 26.07.2011
comment
Я имею в виду, что никакие файлы не были созданы по благодати. Если бы я запускал команду прямо в командной строке, то график генерировался бы нормально и без проблем.   -  person operte    schedule 26.07.2011


Ответы (3)


Вы проверили запуск xmgrace из командной строки с помощью sh? (т. е. вызовите /bin/sh, затем запустите xmgrace..., которая должна быть той же самой оболочкой, которую использует Popen, когда вы устанавливаете shell=true).

Другим решением было бы создание сценария оболочки (создайте файл, например myscript.sh, и запустите chmod +x из терминала). В скрипте вызовите xmgrace:

#!/bin/bash
xmgrace -batch batch.bfile -nosafe -hardcopy

Затем вы можете проверить, работает ли myscript.sh, который должен подобрать любые переменные среды, которые могут быть в вашем профиле, которые могут отличаться от python. Если это сработает, вы можете вызвать скрипт из подпроцесса python.Popen('myscript.sh'). Вы можете проверить, какие переменные среды установлены в python для подпроцесса, запустив:

import os
os.environ
person Adam Morris    schedule 26.07.2011
comment
Я не совсем понял, что вы имели в виду под переменными среды, поскольку я не совсем понимаю их роль во всем этом. Тем не менее, я создал файл с именем batch.sh, запустил его в нужном каталоге, набрав ./batch.sh (после chmod -x'ing), и все заработало отлично. В python я пробовал subprocess.Popen(./batch.sh), но ничего не произошло:\ Я также пробовал с полным каталогом и ничего:\ - person operte; 27.07.2011
comment
И да, я вызвал /bin/sh, выполнил ту же команду, и все заработало нормально :\ - person operte; 28.07.2011
comment
Вы были правы, я наконец понял, что вы имели в виду под PATH, и да, xmgrace не было в PATH python. Написав полный путь к xmgrace в скрипте, я смог заставить все работать правильно. Большое спасибо и извините за мое незнание переменных среды. - person operte; 28.07.2011

Вы можете проверить http://sourceforge.net/projects/graceplot/

person thabubble    schedule 26.07.2011
comment
Обрабатывает ли это данные так же быстро, как обычно делает благодать? Я спрашиваю об этом, потому что ранее я использовал python с matplotlib для построения своих графиков, и я остановился, потому что для больших объемов данных (более 100 000 элементов) python просто боролся с этим:\ я не знаю, было ли это ошибкой python или matplotlib. - person operte; 26.07.2011
comment
Это может дать некоторые накладные расходы, но должно быть таким же быстрым, как изящество, вы можете попробовать, чтобы убедиться, что это так, я ничего не нашел о скорости. - person thabubble; 27.07.2011

При использовании use Popen вы можете записывать вывод приложения на стандартный вывод в stderr и распечатывать его в своем приложении — таким образом вы можете видеть, что происходит:

from subprocess import Popen, PIPE
ps = Popen(reportParameters,bufsize=512, stdout = PIPE, stderr = PIPE)
if ps:
   while 1:
      stdout = ps.stdout.readline()
      stderr = ps.stderr.readline()
      exitcode = ps.poll()
      if (not stdout and not stderr) and (exitcode is not None):
         break
      if stdout:
         stdout = stdout[:-1]
         print stdout
      if stderr:
         stderr = stderr[:-1]
         print stderr
person Adam Morris    schedule 26.07.2011
comment
Проблема в том, что эта команда не производит никакого вывода. Он только генерирует график в папке, указанной внутри batch.bfile :\ - person operte; 27.07.2011
comment
Вы написали полный путь как для xmgrace, так и для файла batch.b? Иногда рабочий каталог python находится в неожиданном месте — может быть, туда попадают выходные данные. Попробуйте в своем коде импортировать os и напечатать os.path.realpath('.') - person Adam Morris; 27.07.2011
comment
Я поместил этот фрагмент кода, который вы мне предложили, в python, и вывод был таким: ./batch.sh: строка 2: xmgrace: команда не найдена. Это как-то связано с окружающей средой, о которой вы говорили? - person operte; 28.07.2011
comment
Вы можете попробовать запустить xmgrace с полным путем (например, /usr/local/bin/xmgrace) — если вы не уверены в полном пути, вы можете ввести xmgrace в терминале (не python). Среда содержит PATH, который представляет собой список каталогов для поиска приложений. Когда вы запускаете из терминала, xmgrace находится на пути, но похоже, что когда вы запускаете из python, это не так. - person Adam Morris; 28.07.2011
comment
Фактически, subprocess.Popen() выдаст вам ошибку, если не сможет найти xmgrace. Итак, xmgrace работает, но не работает должным образом. Похоже, xmgrace использует другие переменные среды, такие как GRACE_HOME. На моей машине (osx/snow leopard) ввод env в терминале предоставляет те же переменные среды, что и ввод import os; os.environ в питоне. - person Adam Morris; 28.07.2011
comment
Мой xmgrace находится в /opt/local/bin/xmgrace. Я уже исправил это в скрипте sh :) - person operte; 28.07.2011