2016-11-30 3 views
-4

Может ли кто-нибудь указать рабочий пример cat, реализованный в Python? Эта программа должна читать из stdin и писать в stdout. У меня есть вопрос: как читать все оставшиеся данные из stdin (не обязательно заканчиваться новой строкой)? Должен ли я использовать неблокирующий IO, отключать буферизацию или делать что-то еще?Как реализовать `cat` в Python

Реализация C:

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/time.h> 
#include <sys/select.h> 

int main() 
{ 

    fd_set set; 
    struct timeval timeout; 

    FD_ZERO(&set); 
    FD_SET(0, &set); 

    timeout.tv_sec = 10; 
    timeout.tv_usec = 0; 

    char buf[1024]; 

    while (1) { 
     select(FD_SETSIZE, &set, NULL, NULL, &timeout); 
     int n = read(0, buf, 1024); 
     if (n == 0) { 
      exit(0); 
     } 
     write(1, buf, n); 
    } 

    return 0; 
} 

Тестовая программа:

import time 

i = 0 
while True: 
    time.sleep(0.2) 
    print(i, end='', flush=True) 
    i += 1 

Ожидаемый результат: Трубопроводы тестовую программу, чтобы cat.py должен выводить номер каждый 0,2 секунды. Результат, как и ожидалось, с встроенным cat или с реализацией C выше.

+0

Я думаю, вы должны попробовать inbuild питона ** SYS ** библиотека 'импорт SYS данных = sys.stdin.read()' и 'sys.stdout' –

+0

Как правило,' echo' читает из стандартного ввода и пишет на стандартный вывод. 'cat' будет читать из файла и писать в stdout (http://man7.org/linux/man-pages/man1/cat.1.html). Просто выполните поиск по чтению из файла в Python. –

+0

@TusharNiras 'sys.stdin.read()' возвращает 'str'. Работают ли они с байтами? – Cyker

ответ

1

Все в порядке, это не очень больно.

import os 
import select 
import sys 

while True: 
    ready, _, _ = select.select([sys.stdin], [], [], 0.0) 
    if sys.stdin in ready: 
     data = os.read(sys.stdin.fileno(), 4096) 
     if len(data) == 0: 
      break 
     os.write(sys.stdout.fileno(), data) 
Смежные вопросы