我是一个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