从Python Popen进程中获取输出FILE?

时间:2011-04-05 22:03:03

标签: python bash popen

我编写了一个python程序来与已编译的程序(称为ProgramX)进行交互,该程序具有一些难以处理的特性。我需要通过我的python程序向ProgramX提供数千个输入文件。我想要做的是获取ProgramX在每次运行时创建的输出文件,并将其重命名为一些合理的,如inputfilename.output。

问题出现在由ProgramX编写的输出文件中 - 它是通过一个不可预测的方法命名的,如果输出文件已经存在,它将写入并“无情地覆盖”输出文件(大多数情况下都是如此)时间)。保存的优雅可能是因为输出文件有一个标准前缀:想想ProgramX.notQuiteRandomNumber。

我能想到的唯一想法是在我的bash shell中这样做:

PROGRAMXOUTPUT=$(ls -ltr ProgramX* | tail -n -1 | awk '{print $8}')
mv $PROGRAMXOUTPUT input.output

我所需要的是90%,但是在我将所有bash编入一系列Popen语句之前,还有更好的方法吗?这个问题感觉就像人们可能有比我想的更好的解决方案。

旁注:我可以毫无问题地获取程序的标准输出,但这是我需要抓取的输出文件。

奖励:我计划在同一目录中运行一系列程序实例化,所以我上面的天真方法可能会开始出现无法预料的问题。所以也许看上去看看ProgramX的PID并遵循其输出的东西。

3 个答案:

答案 0 :(得分:2)

要执行上面的shell脚本,假设您在当前目录中只有一个ProgramX*

import glob, os

programxoutput = glob.glob('ProgramX*')[0]
os.rename(programxoutput, 'input.output')

如果你需要按时间等排序,也有办法做到这一点(看os.stat),但使用最近的修改日期是令人讨厌的竞争条件的一个秘诀,如果你将同时运行多个ProgramX副本。

我建议您为每次运行的ProgramX创建并更改为一个新的,可能是临时目录,这样运行就不可能相互踩踏。 tempfile模块可以为此提供帮助。

答案 1 :(得分:2)

我看到两个选项:

  1. 您可以使用lsof查找打开的文件以查找ProgramX正在编写的文件。
  2. 另一种方法是在临时目录中运行ProgramX(请参阅tempfile以获得设置目录的简便方法。在ProgramX运行之间,您可以清理该目录或继续请求新的临时目录,如果您计划同时运行多个copieProgramX。

答案 2 :(得分:0)

如果只有一个ProgramX*文件,那么只需:

mv ProgramX* input.output