Python 标准流文件是否存储在磁盘中?

Python 标准流文件是否存储在磁盘中?,python,linux,windows,Python,Linux,Windows,来自维基百科: 在计算机编程中,标准流是计算机程序开始执行时与环境之间预先连接的输入和输出通信通道。这三个I/O连接称为标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。最初,I/O是通过物理连接的系统控制台进行的(通过键盘输入,通过监视器输出),但标准流对此进行了抽象。” 正如我从wiki中了解到的,Stdin传统上是键盘,stdout是监视器(输出)。但是,由于大多数现代计算机都使用GUI,现在这些是什么。例如,如果我打开Linux Shell的cmd.exe或其他

来自维基百科:

在计算机编程中,标准流是计算机程序开始执行时与环境之间预先连接的输入和输出通信通道。这三个I/O连接称为标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。最初,I/O是通过物理连接的系统控制台进行的(通过键盘输入,通过监视器输出),但标准流对此进行了抽象。”

正如我从wiki中了解到的,Stdin传统上是键盘,stdout是监视器(输出)。但是,由于大多数现代计算机都使用GUI,现在这些是什么。例如,如果我打开Linux Shell的cmd.exe或其他什么,然后用以下命令运行Python:

# In cmd.exe   
>>> import sys 
>>> sys.stdout
<open file '<stdout>', mode 'w' at 0x000000000224B0C0>
cmd.exe中的
#
>>>导入系统
>>>系统标准输出
A)我注意到
sys.stdout
是内存中的一个文件(对象),它只是Python解释器创建的对象吗?还是
sys.stdout
物理存储在硬盘驱动器或任何存储方式中


B)我认为cmd.exe是一个Win32应用程序,它有stdin、stdout或stderr吗?如果有,它们在哪里?它们只是存储在内存中吗?

Python中的
文件是一个文件描述符的抽象,它只是处理文件和流(以及*nix上的其他东西)的一种低级方式.这绝不意味着磁盘上有任何内容


此外,Windows应用程序在默认情况下没有可用的标准流;应用程序必须显式打开它们才能使其可用。

它们被称为流而不是文件,原因是:它们代表数据的源或汇。有时发送到流的数据存储在磁盘中的文件中,但有时是数据只是被另一个程序接收

例如,当将两个命令管道连接在一起时:

$ ls | sort
第一个命令的标准输出连接到第二个命令的标准输入

关于标准流在一个简单的shell中连接的位置,标准流连接到虚拟终端程序。在linux中,它将是程序shell(xterm、gnome terminal、kdterminal…)。在Windows中,它将是控制台管理器,由操作系统模块直接创建(通常,但不同Windows版本的详细信息有所不同)


然后,当您写入标准输出时,写入的字符显示在屏幕上,当您读取标准输入时,终端等待键盘输入。

Windows进程有3个标准句柄,您可以通过
GetStdHandle
SetStdHandle
获取和修改。这些句柄在内部设置进程参数ters
StandardInput
StandardOutput
StandardError
句柄。在Windows 8+中,console处理与console主机进程conhost.exe对话的
ConDrv
设备的参考内核
文件
对象,并且通信使用标准I/O系统调用(
NtWriteFile
等)。在Windows 8之前,它们不是内核句柄,而是由控制台本身管理的特殊标记的控制台句柄(低2位集),通信使用LPC系统调用。请注意,Windows在系统级别不使用POSIX文件描述符,其中包含特殊文件0(
STDIN
)、1(
STDOUT
)和2(
STDERR
)。相反,这些由C运行时低I/O层提供,该层将Windows句柄映射到POSIX文件描述符。进程中的每个CRT(通常有2个或更多)维护自己的映射,这对于使用链接到msvcrt.dll而不是Python.exe使用的CRT的MinGW构建的Python扩展模块来说是一个问题。还要注意,Python 2使用C
文件
流。因此,例如,
sys.stdout
引用C
stdout
,它在Windows上引用低I/O
stdout
Python 3不使用C标准I/O。它在POSIX层上有自己的文本、缓冲区和原始流的层次结构。在Windows 7+中,它是conhost.exe的单独实例,而不是csrss.exe系统进程。在Windows 8+中,部分工作也由condrv.sys内核设备驱动程序处理。什么你确切地说是流吗?我在这方面不是很在行。@direprobs:流是一个对象(抽象)它代表了你可以从中读取数据或写入数据的东西。有很多种流:文件、套接字、管道、FIFO、控制台……一般的想法是,不管使用哪种类型,你都或多或少使用相同的函数来写/读流。你可以把流看作是一个通用文件的同义词。n Python(或其他任何地方)您使用的字file有时指的是任何类型的流,而不是特定的文件系统文件。@rodrigo因此,基本上,当我打开cmd.exe时,会为(连接到)创建三个流窗口?@direprobs:是的,正是这样。当您从该命令窗口运行控制台程序时,新程序将继承这三个流的句柄,并与父cmd共享它们。