Python,子进程和文本文件创建

时间:2012-05-14 00:20:45

标签: python text-files subprocess popen

道歉,如果其他地方已经回答了这种事情。我使用Python使用subprocess.Popen()运行Windows可执行文件。可执行文件生成.txt文件和一些其他输出文件作为其操作的一部分。然后,我需要使用subprocess.Popen()运行另一个可执行文件,该文件使用原始.exe文件的输出。

问题是,它是.exe文件,而不是Python控制输出文件的创建,因此我无法控制第一个文本文件写入磁盘需要多长时间才能使用它作为第二个.exe文件的输入。

显然,在第一个文本文件写入磁盘之前,我无法运行第二个可执行文件。

subprocess.wait()似乎没有帮助,因为第一个可执行文件在文本文件写入磁盘之前终止。我也不想使用某种等待任意时间(比如几秒)的函数,然后继续执行第二个.exe文件。这将是低效的,因为它可能等待超过必要的时间,因此浪费时间。另一方面,如果输出文本文件非常大,它可能不会等待足够长的时间。

所以我想我需要某种类型的监听器,它等待文本文件完成写入,然后继续执行第二个subprocess.Popen()调用。这可能吗?

任何帮助都将不胜感激。


更新(请参阅下面的Neil建议)

os.path.getmtime()的问题是修改时间在写入期间不止一次更新,因此非常大的文本文件(比如〜500 Mb)需要在os.path.getmtime之间有相对较长的等待时间( )电话。我使用time.sleep()来执行此操作。我想这个解决方案是可行的,但不是最有效的时间使用。

另一方面,我在尝试打开文件进行写访问时遇到了更大的问题。我使用以下循环:

while True:
    try:
        f = open(file, 'w')
    except:
        # For lack of something else to put in here
        # (I don't want to print anything)
        os.path.getmtime(file) 
    else:
        break

这种方法似乎有效,因为当Windows可执行文件正在编写文件时,Python基本上会暂停,但之后我会在代码的下一部分使用文本文件,并发现刚刚写入的内容已被擦除

我知道他们写的是因为我可以看到Windows资源管理器中的文件大小在可执行文件执行时会增加,所以我只能假设最后调用open(文件'w')(一旦可执行文件有完成它的工作)导致文件以某种方式被擦除。

显然我做错了什么。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

可能有很多方法可以做你想要的。想到的一点是,您可以使用os.path.getmtime()轮询修改时间,并查看其何时发生变化。如果修改日期是在您调用可执行文件之后,但仍然是几秒钟之前,您可以认为它已经完成。

或者,您可以尝试打开文件进行写访问(只是没有实际编写任何内容)。如果失败,则意味着其他人正在编写它。

答案 1 :(得分:0)

这一切听起来都很脆弱,但我认为你的手也有点束缚。

我想到的一个建议是,如果写入的文本文件可能具有可识别的文件结束标记。我创建了一个如下所示的文本文件:

BEGIN
DATA
DATA
DATA
END

鉴于此文件,我可以通过使用os.seek来判断是否已将“END”写入文件的末尾:

>>> import os
>>> fp = open('test.txt', 'r')
>>> fp.seek(-4, os.SEEK_END)
>>> fp.read()
'END\n'