我编写了一个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并遵循其输出的东西。
答案 0 :(得分:2)
要执行上面的shell脚本,假设您在当前目录中只有一个ProgramX*
:
import glob, os
programxoutput = glob.glob('ProgramX*')[0]
os.rename(programxoutput, 'input.output')
如果你需要按时间等排序,也有办法做到这一点(看os.stat
),但使用最近的修改日期是令人讨厌的竞争条件的一个秘诀,如果你将同时运行多个ProgramX副本。
我建议您为每次运行的ProgramX创建并更改为一个新的,可能是临时目录,这样运行就不可能相互踩踏。 tempfile模块可以为此提供帮助。
答案 1 :(得分:2)
我看到两个选项:
答案 2 :(得分:0)
如果只有一个ProgramX*
文件,那么只需:
mv ProgramX* input.output