2

我是win7用户。

我无意中读到了command1 < infile > outfile*nix 系统中的重定向(如),然后我发现在 Windows(链接)中可以完成类似的事情。python 也可以用管道(?)或标准输入/标准输出(?)做这样的事情。

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

我使用某种专有的 Windows 程序 (.exe)。该程序能够将数据附加到文件中。为简单起见,我们假设它相当于类似

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

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

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

  • 程序(.exe)写了一些东西。

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

你能否写下如何在 python 中执行此操作,或者在 win cmd/.bat 或其他方式中。

这是非常酷的事情。我想学习怎么做!:D

4

4 回答 4

2

如果我正确阅读了您的问题,那么您希望将输出从一个命令传递到另一个命令。

这通常是这样完成的:

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”)。

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

于 2012-11-27T10:26:13.383 回答
0
import sys
sys.stdin = open('textfile.txt', 'r')
for line in sys.stdin:
    process(line)
于 2012-11-27T10:02:56.133 回答
0

如果程序写入textfile.txt,您不能将其更改为重定向到stdin您的 Python 脚本,除非您重新编译程序以执行此操作。

如果要编辑程序,需要将其写入stdout,而不是文件系统上的文件。这样,您可以使用重定向运算符将其输入您的 Python 脚本(在您的情况下为|运算符)。

假设您不能这样做,您可以编写一个程序来轮询文本文件的更改,并仅使用新写入的数据,方法是跟踪上次更新时读取的数据量。

于 2012-11-27T10:08:09.893 回答
0

当您使用<将文件的输出定向到 python 脚本时,该脚本会在其stdinstream上接收该数据。

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

import sys
for line in sys.stdin:
    # do something with line
于 2012-11-27T10:08:22.903 回答