【问题标题】:Grabbing output FILE from Python Popen process?从 Python Popen 进程中获取输出文件?
【发布时间】:2011-04-05 22:03:03
【问题描述】:

我编写了一个 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 并跟随它的输出。

【问题讨论】:

    标签: python bash popen


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      我看到的两个选项:

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

      【讨论】:

        【解决方案3】:

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

        mv ProgramX* input.output
        

        【讨论】:

          猜你喜欢
          • 2013-04-05
          • 2020-07-05
          • 1970-01-01
          • 2014-08-28
          • 2015-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-21
          相关资源
          最近更新 更多