2011-07-25 36 views
1

我必须从包含数据的多个文件制作图形。我已经找到了一种方法来运行一个简单的命令使用subprocess.Popen()执行xmgrace批处理()

xmgrace -batch batch.bfile -nosafe -hardcopy 

其中batch.bfile是有风度命令的文本文件打印我想要的图形。我已经尝试过它手动,它完美的作品。要做到这一点与几个文件,我只需要编辑batch.b文件中的一个参数,并在每次进行更改时运行相同的命令。

我已经编写了一个编辑batch.bfile的python代码,并通过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

+0

没有更改,因为在nothign返回或打印? – thabubble

+0

恩,我的意思是没有文件生成。如果我直接在命令行中运行命令,图形将正常生成并且没有任何问题。 – operte

回答

0

你是否检查过使用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的subprocess.Popen('myscript.sh')调用脚本。您可以通过运行来检查python中是否为子进程设置了环境变量:

import os 
os.environ 
+0

我并没有完全理解环境变量的含义,因为我不太了解它们在这些环境中的功能。不过,我创建了一个名为batch.sh的文件,通过在“./batch.sh”(在chmod -x'ing之后)键入我想要的目录并将它运行完毕。在python中,我尝试了subprocess.Popen(“./ batch.sh”),但没有发生任何事情:\我也尝试了完整的目录,但没有:\ – operte

+0

是的,我调用/ bin/sh,运行相同的命令,罚款:\ – operte

+0

你是对的,我终于明白你的意思是什么PATH的东西,是的,xmgrace不是在python的路径。通过在脚本中写入xmgrace的完整路径,我可以使所有内容正常工作。非常感谢你,原谅我对环境变量的无知。 – operte

0
+0

这样处理数据的速度与正常情况下一样快吗?我问这是因为之前我用python和matplotlib来做我的情节,并且因为大量的数据(100k +元素)而停下来,python只是在挣扎着:\我不知道它是python还是matplotlib的错。 – operte

+0

它可能会让你头脑发热,但应该像恩典一样快,你可以试试看它是否是,我找不到有关速度的任何信息。 – thabubble

0

使用时使用POPEN,你可以捕捉应用程序的输出到标准输出到标准错误,你的应用程序中打印 - 这样你可以看到发生了什么:

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 
+0

问题是这个命令不会产生任何输出。它只会在batch.b文件中指定的文件夹中生成一个图形:\ – operte

+0

您是否为xmgrace和batch.b文件编写了完整路径?有时python的工作目录在一个意想不到的地方 - 可能是输出在那里登陆。尝试在你的代码导入操作系统,并打印os.path.realpath('。') –

+0

我把这段代码你建议我在python中,输出是这样的:./batch.sh:第2行:找不到命令xmgrace:。这是否与你所谈论的环境有关? – operte