【问题标题】:Executing an xmgrace batch with subprocess.Popen()使用 subprocess.Popen() 执行 xmgrace 批处理
【发布时间】:2011-10-13 00:07:16
【问题描述】:

我必须从几个包含数据的文件中制作图表。我已经找到了一种运行简单命令的方法

xmgrace -batch batch.bfile -nosafe -hardcopy

其中 batch.bfile 是一个带有宽限命令的文本文件,用于打印我想要的图形。我已经手动尝试过了,效果很好。要对多个文件执行此操作,我只需在 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

【问题讨论】:

  • 没有任何改变,因为没有返回或打印?
  • 没有文件是由恩典生成的,我的意思是。如果我直接在命令行中运行命令,图形会正常生成,没有任何问题。

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


【解决方案1】:

【讨论】:

  • 这个处理数据的速度是否和正常情况下一样快?我问这个是因为以前我使用 python 和 matplotlib 来绘制我的绘图,但我停止了,因为对于大量数据(100k + 元素),python 只是在努力解决它:\ 我不知道这是 python 还是 matplotlib 的错。
  • 它可能会有些过头但应该和优雅一样快,你可以试试看是不是,我找不到任何关于速度的信息。
【解决方案2】:

使用 use 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

【讨论】:

  • 问题是这个命令不产生任何输出。它只在 batch.bfile 中指示的文件夹中生成一个图形:\
  • 您是否为 xmgrace 和 batch.bfile 编写了完整路径?有时 python 的工作目录在一个意想不到的地方——可能是输出在那里登陆。尝试在您的代码中导入 os,然后打印 os.path.realpath('.')
  • 我把你建议我的这段代码放在 python 中,输出是这样的:./batch.sh: line 2: xmgrace: command not found。这和你说的环境有关吗?
  • 您可以尝试使用完整路径(例如 /usr/local/bin/xmgrace)运行 xmgrace - 如果您不确定完整路径,可以在终端(不是python)。环境包含 PATH,它是用于搜索应用程序的目录列表。当你从终端运行时,xmgrace 在路径上,但是当你从 python 运行时,它看起来不是。
  • 实际上,如果 subprocess.Popen() 找不到 xmgrace,它会给你一个错误。所以 xmgrace 正在运行,但无法正常工作。看起来 xmgrace 使用了其他环境变量,例如“GRACE_HOME”。在我的机器(osx / 雪豹)上,在终端输入“env”提供与在 python 中输入“import os;os.environ”相同的环境变量。
【解决方案3】:

您是否检查过使用 sh 从命令行运行 xmgrace? (即调用 /bin/sh,然后运行 ​​xmgrace... 这应该与设置 shell=true 时 Popen 使用的 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

【讨论】:

  • 我不太明白你所说的环境变量是什么意思,因为我不太了解它们在这一切中的作用。不过,我创建了一个名为 batch.sh 的文件,通过键入“./batch.sh”(在 chmod -x'ing 之后)在我想要的目录上运行它,它运行得很好。在 python 中,我尝试了 subprocess.Popen("./batch.sh") 但没有发生任何事情:\ 我也尝试使用完整目录,但什么也没有:\
  • 是的,我调用了 /bin/sh,运行了相同的命令,一切正常:\
  • 你说得对,我终于明白你所说的 PATH 是什么意思,是的,xmgrace 不在 python 的 PATH 上。通过在脚本中编写 xmgrace 的完整路径,我可以使一切正常工作。非常感谢,请原谅我对环境变量的无知。
猜你喜欢
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2021-10-17
相关资源
最近更新 更多