使用subprocess.Popen()执行xmgrace批处理

时间:2011-07-25 23:14:06

标签: python command-line subprocess popen batch-processing

我必须使用数据从多个文件制作图表。我已经找到了运行简单命令的方法

xmgrace -batch batch.bfile -nosafe -hardcopy

其中batch.bfile是一个文本文件,带有grace命令来打印我想要的图形。我已经手动尝试过,它完美无缺。要使用多个文件执行此操作,我只需编辑batch.bfile中的一个参数,并在每次进行更改时运行相同的命令。

我已经编写了一个python代码,它编辑batch.bfile并通过for循环遍历所有数据文件。在每个循环步骤中,我想直接在命令行中运行上述命令。

搜索了一下后,我找到了两个解决方案,一个是os.system(),另一个是subprocess.Popen(),我只能通过编写来使subprocess.Popen()工作而不会出现任何错误:

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

问题是,这在实践中没有做任何事情,即它与在命令行中直接运行命令不同。我已经尝试编写batch.bfile的完整目录但没有改变。

我正在使用Python 2.7和Mac OS 10.7

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

当使用Popen时,你可以将应用程序的输出捕获到stdout到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

答案 2 :(得分:0)

您是否已使用sh检查了从命令行运行xmgrace? (即调用/ bin / sh,然后运行xmgrace ...这应该是Popen在设置shell = true时使用的shell)。

另一个解决方案是创建一个shell脚本(创建一个类似myscript.sh的文件,并从终端运行chmod + x)。在脚本中调用xmgrace:

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

然后你可以测试myscript.sh是否有效,它应该拾取你的配置文件中可能与python不同的任何环境变量。如果这样可行,你可以从python的subprocess.Popen('myscript.sh')调用脚本。您可以通过运行以下命令来检查python中为子进程设置的环境变量:

import os
os.environ