2011-04-05 79 views
0

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

问题出现在由ProgramX编写的输出文件中 - 它是通过一种不可预知的方法命名的,它将写入输出文件并“无情地覆盖”它(如果已经存在)的时间)。节约宽限可能伴随着输出文件有一个标准前缀的事实:think ProgramX.notQuiteRandomNumber。

唯一想我能想到做的就是这样的事情在我的bash shell:

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

这确实90%的我需要什么,但在此之前我编程一切庆典为一系列POPEN语句, 有一个更好的方法吗?这个问题感觉像人们可能会有比我想象的更好的解决方案。

旁注:我可以抓住程序的标准输出没有问题,但它是我需要抓取的输出文件。

奖励:我打算在同一个目录下运行一堆程序实例,所以我上面的天真方法可能会出现无法预料的问题。因此,也许有些幻想看到ProgramX的PID并遵循它的输出。

回答

2

要怎么做你上面的shell脚本呢,假设你只在当前目录下有一个ProgramX*

import glob, os 

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

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

我会建议您改为创建并更改为每次运行ProgramX的新临时目录,这样运行时就不可能彼此踩踏。 tempfile模块可以帮助解决这个问题。

0

如果只有一个ProgramX*文件,然后怎么样只是:

mv ProgramX* input.output 
2

两个选项,我看到:

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