【问题标题】:How to implement `cat` in Python如何在 Python 中实现`cat`
【发布时间】:2017-04-15 02:57:42
【问题描述】:

谁能给出一个用 Python 实现的cat 的工作示例?该程序应从标准输入读取并写入标准输出。我的问题是:如何从标准输入读取所有剩余数据(不一定由换行符终止)?我应该使用非阻塞 IO、关闭缓冲还是做其他事情?

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 实现的预期一致。

【问题讨论】:

  • 我认为你应该尝试内置 python sysimport sys data = sys.stdin.read()sys.stdout
  • 通常,echo 从标准输入读取并写入标准输出。 cat 将从文件中读取并写入标准输出 (man7.org/linux/man-pages/man1/cat.1.html)。只需搜索如何在 Python 中读取文件即可。
  • @TusharNiras sys.stdin.read() 返回str。他们也和bytes一起工作吗?
  • 标准流默认为文本模式。要向它们写入或读取二进制数据,请使用底层二进制缓冲区。例如,要将字节写入标准输出,请使用 sys.stdout.buffer.write(b'abc')
  • @TusharNiras 我应该调用什么方法on sys.stdin.bufferreadreadline 或其他?

标签: python pipe


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 2012-08-07
    • 2013-07-27
    • 1970-01-01
    • 2021-04-03
    • 2019-07-11
    • 2011-01-22
    • 2017-01-02
    相关资源
    最近更新 更多