在Windows 7下的python中使用文本文件作为标准input

我是一个win7用户。

我意外地读了* nix系统中的redirect(比如command1 < infile > outfile ),然后我发现在Windows(链接)中可以做类似的事情 。 而且python也可以用pipe(?)或者stdin / stdout(?)来做这样的事情。

我不明白这是怎么发生在Windows中,所以我有一个问题。

我使用某种专有的Windows程序(.exe)。 该程序能够将数据附加到文件。 为了简单,让我们假设它是类似的东西

 while True: f = open('textfile.txt','a') f.write(repr(ctime()) + '\n') f.close() sleep(100) 

问题:我可以使用这个文件(textfile.txt)作为标准input吗? 我的意思是脚本(运行时)应该总是(不是一次)处理所有的新数据,即

在“永无止境的循环”中:

  • 程序(.exe)写入内容。

  • Python脚本捕获数据和进程。

你能写出如何在Python中做到这一点,或者在win cmd / .bat或其他方式。

这是非常酷的事情。 我想学习如何做到这一点! :d

如果我正确地阅读你的问题,那么你想管输出从一个命令到另一个。

这通常是这样做的:

 cmd1 | cmd2 

但是,你说你的程序只写入文件。 我会仔细检查文档,看看他们是不是一个方法来获取命令写入标准输出,而不是一个文件。

如果这是不可能的,那么你可以创建所谓的named pipe 。 它在文件系统上显示为一个文件,但实际上只是一个可以写入和读取的数据缓冲区(数据是一个流,只能被读取一次)。 意思是读取它的程序不会完成,直到写入管道的程序停止写入并关闭“文件”。 我没有Windows上的命名管道的经验,所以你需要问一个新的问题。 管道的一个缺点是它们有一个有限的缓冲区大小。 因此,如果没有程序从管道读取数据,那么一旦缓冲区满了,写入程序将无法继续,只能等待程序开始读取管道。

另一种方法是在Unix上有一个称为tail的程序,它可以被设置为连续监视一个文件的变化,并在文件追加到文件时输出任何数据。

 tail --follow=textfile.txt --retry | mycmd # wait for data to be appended to the file and output new data to mycmd cmd1 >> textfile.txt # append output to file 

有一点需要注意的是, tail不会因为第一个命令已经停止写入文件而停止。 tail将继续永远听取该文件的变化,或直到mycmd停止收听tail ,或直到tail被杀死(或“sigint-ed”)。

这个问题有关如何获得一个版本的Windows机器上的各种答案。

 import sys sys.stdin = open('textfile.txt', 'r') for line in sys.stdin: process(line) 

如果程序写入到textfile.txt ,除非重新编译程序,否则不能将其更改为重定向到Python脚本的stdin

如果您要编辑程序,则需要将其写入stdout ,而不是文件系统上的文件。 这样,你可以使用重定向操作符来将它提供给你的Python脚本(在你的情况下是|操作符)。

假设你不能这样做,你可以编写一个程序来轮询文本文件上的变化,并且只记录新写入的数据,通过跟踪它上次更新时读取的内容。

当您使用<将文件的输出引导至python脚本时,该脚本stdin流接收该数据。

只需从sys.stdin读取数据即可:

 import sys for line in sys.stdin: # do something with line