Использование textfile в качестве stdin в python под windows 7


Я пользователь win7.

Я случайно прочитал о перенаправлениях (например, command1 < infile > outfile) в системах *nix, а затем обнаружил, чтонечто подобное можно сделать в Windows (link) . И питон тоже может сделать что-то подобное с трубами(?) или stdin/stdout(?).

Я не понимаю, как это происходит в Windows, поэтому у меня есть вопрос.

Я использую какую-то проприетарную windows-программу (.исполняемый). Эта программа способна добавлять данные в файл. Для простоты предположим, что что это эквивалент чего-то вроде

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

Вопрос: Могу ли я использовать этот файл (textfile.txt) как stdin? Я имею в виду, что скрипт (пока он работает) должен всегда (а не один раз) обрабатывать все новые данные, т. е.

В "бесконечном цикле":

  • Программа (.exe) пишет что-то.

  • Скрипт Python захватывает данные и процессы.

Не могли бы вы написать, как это сделать в python, или, может быть, в win cmd/.летучая мышь или как-то еще еще.

Это безумно круто. Я хочу научиться этому! :D

4 2

4 ответа:

Если я правильно читаю ваш вопрос, то вы хотите передать вывод из одной команды в другую.

Обычно это делается так:

cmd1 | cmd2
Однако вы говорите, что ваша программа записывает только в файлы. Я бы дважды проверил документацию, чтобы увидеть, не является ли их способ получить команду для записи в stdout вместо файла. Если это невозможно, то вы можете создать то, что известно как 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.

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

Если программа записывает в textfile.txt, вы не можете изменить это, чтобы перенаправить в stdin вашего скрипта Python, если вы не перекомпилируете программу для этого.

Если бы вы были для редактирования программы, вам нужно было бы сделать ее запись в stdout, а не в файл файловой системы. Таким образом, вы можете использовать операторы перенаправления, чтобы передать его в свой скрипт Python (в вашем случае оператор |).

Предполагая, что вы не можете этого сделать, вы можете написать программу, которая опрашивает изменения в тексте файл, и потребляет только недавно записанные данные, отслеживая, сколько он прочитал в последний раз, когда он был обновлен.

Когда вы используете < для направления вывода файла в скрипт python, этот скрипт получает эти данные на своем компьютере.stdin поток .

Просто прочитайте из sys.stdin, чтобы получить эти данные:

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