【发布时间】: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 sys 库
import 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.buffer?read或readline或其他?