为什么这段代码在 Windows 和 Linux 上打印出不同的结果?

2024-02-03

此代码在 Windows 和 Linux 之间打印不同的字符串。

test.py:

print(";".join([str(i) for i in range(10000)]))

平台:x86_64 Linux 4.4 .0-17763 - 微软
Python版本:3.7.2
终端:bash、fish

缩写输出:

$ python --version
Python 3.7.2
$ python test.py
0;1;2;3;4;5;6....9997;9998;9999
$ python -u test.py
0;1;2;3;4;5;6....9997;9998;9999

平台:Windows 10 1809
Python版本:3.6.8、3.7.0、3.7.2
终端:cmd、powershell

缩写输出:

./python --version
Python 3.6.8
./python test.py
0;1;2;3;4;5;6....9997;9998;9999
./python -u test.py
0;1;2;3;4;5;6....2663;2664;2665;26
./python --version
Python 3.7.0
./python test.py
0;1;2;3;4;5;6....9997;9998;9999
./python -u test.py
0;1;2;3;4;5;6....2663;2664;2665;26
./python --version
Python 3.7.2
./python test.py
0;1;2;3;4;5;6....9997;9998;9999
./python -u test.py
0;1;2;3;4;5;6....2663;2664;2665;26

那么为什么在 Windows 中-uarg 导致输出被截断(仅来自0 to 2666)?
(当使用python -u test.py > a.txt将输出重定向到文件,它可以正常工作。)

也许与缓冲有关?


通过 WINAPI 写入的控制台的大小WriteFile and WriteConsoleW https://web.archive.org/web/20181222101912/https://learn.microsoft.com/en-us/windows/console/writeconsole据记录有一个模糊定义的限制,如下:

nNumberOfCharsToWrite [in]
要写入的字符数。如果指定的总大小 字符数超出可用堆,该函数失败并显示ERROR_NOT_ENOUGH_MEMORY.

没有记录这指的是哪个“堆”。一个进程可以有多个不同大小的堆(固定或动态)。 NT运行时库中的本机堆实现(例如RtlCreateHeap)可以在指定地址创建堆,这样可以方便地访问与其他进程共享的内存。使用共享堆通常与本地进程间通信 https://en.wikipedia.org/wiki/Local_Inter-Process_Communication(LPC) 端口——或 NT 6.0+ 中的异步 LPC。 LPC 端口用于在应用程序和系统服务之间传递消息,例如会话管理器 (smss.exe)、服务控制管理器 (services.exe)、本地安全机构 (lsass.exe)、桌面会话服务器 (csrss.exe)和控制台主机 (conhost.exe) 的实例。直接排队到 LPC 端口的消息限制为 256 字节。通过将消息排队到引用共享内存的端口来传递较大的消息。

事实证明,控制台的旧实现(NT 6.3之前)使用LPC作为I/O通道,而上述堆是仅 64 KiB。这是一个特殊的设计选择。我认为有人对用户模式子系统、消息传递酷爱喝得太多了。正确的 NT I/O 使用具有 I/O 系统服务的设备,包括NtCreateFile, NtReadFile, NtWriteFile, and NtDeviceIoControlFile.

控制台应用程序不知道该堆中有多少可用于写入。 Python 可以从 64 KiB 开始并逐渐减小,但它原始文件 I/O https://docs.python.org/3/library/io.html#raw-file-i-o要求每次调用一次系统调用。相反,它将写入上限限制为 32 KiB,这应该会成功。此限制允许写入最多 16K UTF-16 代码点的宽字符字符串。一个复杂的问题是控制台 I/O 堆栈在 3.6+ 中使用 UTF-8,必须通过MultiByteToWideChar。目前它只是重复地将 UTF-8 缓冲区分成两半,直到结果长度小于 16K。因此,在问题的示例中,写入 48,889 个字符会减半为 24,444 个字符,然后再次减半为 12,222 个字符。 (IMO,最好尝试写入最多 16K 代码点;获取实际写入的数字,然后调用WideCharToMultiByte确定写入的 UTF-8 字节数。如果 UTF-8 2-4 字节序列与切点重叠,当前的设计实际上存在错误。)

在 NT 6.3+ (Windows 8.1+) 中,控制台 I/O 没有此大小限制,因为它使用 ConDrv 设备和 I/O 系统调用而不是 LPC。然而,仅仅为了支持无缓冲文本 I/O 堆栈而对代码进行特殊封装是不值得的,如由-u命令行选项。我们期望交互式控制台 I/O 能够被缓冲。普通的文本 I/O 实际上是不允许的open称呼。例如:

>>> open('conout$', 'w', buffering=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: can't have unbuffered text I/O

对 Windows 7 的扩展支持将于 2020 年 1 月 14 日结束,因此 Python 3.8 将是支持它的最后一个版本。 Python 3.9 中应删除控制台写入限制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这段代码在 Windows 和 Linux 上打印出不同的结果? 的相关文章

  • Python - 来自 .进口

    我第一次尝试图书馆 我注意到解决图书馆内导入问题的最简单方法是使用如下结构 from import x from some module import y 我觉得这件事有些 糟糕 也许只是因为我不记得经常看到它 尽管公平地说我还没有深入研究
  • 检查 Python 中的可迭代对象中的所有元素的谓词是否计算为 true

    我很确定有一个常见的习语 但我无法通过谷歌搜索找到它 这是我想做的 用Java Applies the predicate to all elements of the iterable and returns true if all ev
  • 如何在Python中同时运行两只乌龟?

    我试图让两只乌龟一起移动 而不是一只接着另一只移动 例如 a turtle Turtle b turtle Turtle a forward 100 b forward 100 但这只能让他们一前一后地移动 有没有办法让它们同时移动 有没有
  • sklearn 中的 pca.inverse_transform

    将我的数据拟合后 X 我的数据 pca PCA n components 1 pca fit X X pca pca fit transform X 现在 X pca 具有一维 当我根据定义执行逆变换时 它不是应该返回原始数据 即 X 二维
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • pytest:同一接口的不同实现的可重用测试

    想象一下我已经实现了一个名为的实用程序 可能是一个类 Bar在一个模块中foo 并为其编写了以下测试 测试 foo py from foo import Bar as Implementation from pytest import ma
  • Docker 警告:无法从守护进程获取默认注册表端点

    在 Windows 10 上 当我调用 docker 命令时 docker pull mongo windowsservercore 我得到以下输出 Warning failed to get default registry endpoi
  • 通过索引访问Python字典的元素

    考虑一个像这样的字典 mydict Apple American 16 Mexican 10 Chinese 5 Grapes Arabian 25 Indian 20 例如 我如何访问该字典的特定元素 例如 我想在对 Apple 的第一个
  • 使用 Pandas 计算 delta 列

    我有一个数据框 如下所示 Name Variable Field A 2 3 412 A 2 9 861 A 3 5 1703 B 3 5 1731 A 4 0 2609 B 4 0 2539 A 4 6 2821 B 4 6 2779 A
  • Jython 和 SAX 解析器:允许的实体不超过 64000 个?

    我做了一个简单的测试xml saxJython 中的解析器在处理大型 XML 文件 800 MB 时遇到以下错误 Traceback most recent call last File src project xmltools py li
  • ANTLR 获取并拆分词法分析器内容

    首先 对我的英语感到抱歉 我还在学习 我为我的框架编写 Python 模块 用于解析 CSS 文件 我尝试了 regex ply python 词法分析器和解析器 但我发现自己在 ANTLR 中 第一次尝试 我需要解析 CSS 文件中的注释
  • 使用“默认”环境变量启动新的子进程

    我正在编写一个构建脚本来解析依赖的共享库 及其共享库等 这些共享库在正常情况下是不存在的PATH环境变量 为了使构建过程正常工作 让编译器找到这些库 PATH已更改为包含这些库的目录 构建过程是这样的 加载器脚本 更改 PATH gt 基于
  • Elasticsearch 通过搜索返回拼音标记

    我用语音分析插件 https www elastic co guide en elasticsearch plugins current analysis phonetic html由于语音转换 从弹性搜索中进行一些字符串匹配 我的问题是
  • 如何与其他用户一起使用 pyenv?

    如何与其他用户一起使用 pyenv 例如 如果我在用户 test 的环境中安装了 pyenv 则当我以 test 身份登录时可以使用 pyenv 但是 当我以其他用户 例如 root 身份登录时如何使用 pyenv 即使你这么做了 我也会s
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • 双击打开 ipython 笔记本

    相关文章 通过双击 osx 打开 ipython 笔记本 https stackoverflow com questions 16158893 open an ipython notebook via double click on osx
  • python 线程安全可变对象复制

    Is 蟒蛇的copy http docs python org 2 library copy html模块线程安全吗 如果不是 我应该如何在 python 中以线程安全的方式复制 deepcopy 可变对象 蟒蛇的GIL http en w
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS
  • 查找总和为给定数字的值组合的函数

    这个帖子查找提供的 Sum 值的组合 https stackoverflow com a 20194023 1561176呈现函数subsets with sum 它在数组中查找总和等于给定值的值的组合 但由于这个帖子已经有6年多了 我发这

随机推荐

  • guvectorize 在 nopython 模式下不解析类型

    我正在努力解决 numba 错误Untyped global name is a subset Cannot determine Numba type of
  • React div 容器 onClick 与复选框 onChange 冲突

    在下面的 React 类中 我在 div 容器中有一个复选框 我想要单击容器来切换复选框 我也think我需要绑定复选框输入本身的 onChange 以处理诸如用户使用制表符 空格来切换复选框状态之类的事情 如果我don t指定 onCha
  • Kubernetes - 从作业连接到 cassandra 到不同的 pod

    当我尝试执行以下命令时 bin sh c cqlsh cassandra my namespace svc cluster local f path to schema cql 从我的工作中 我收到以下错误 Traceback most r
  • GZIP PlayFramework 2.0 中的响应正文

    我正在开发 Playframework 2 x 应用程序 我的应用程序中的控制器将 JSON 响应返回到浏览器 端点 我想知道是否有一种简单的方法来启用响应正文的 GZIP 压缩 目前在 2 0 4 版本中 对于非资产没有简单的方法 对于
  • 使用 Angular 5 的 IE 11 兼容性错误

    我已经构建了 Angular 应用程序 然后在服务器中运行它 我收到的错误未在本地主机中显示 Unable to get property onHover of undefined or null reference File Chart
  • 按列值将数据拆分为不同的工作表

    假设我有一个工作表 A 列中有多个不同的值 有没有办法创建一个宏 将列条目为 0 的所有行放入一个单独的工作表中 所有行的条目 1 都放在另一个工作表中 依此类推 我的第一直觉是创造一些东西 1 按相关列排序 2 使用 IF 语句检查前一个
  • ListViewItem水平拉伸UWP 10

    我想水平拉伸ListView在UWP 10中 我还设置了HorizontalContentAlignment to Stretch 它有点有效 但并不完全是我想要的结果 我将 ListView 背景设置为 Aqua 因此您可以看到 List
  • 在另一个类中创建类的实例(使用通用示例)

    我正在通过书籍和互联网学习Python 但我陷入了课堂问题 2个问题 如何在另一个 单独的 类中创建一个类的实例 如何在类和嵌套 类之间传递变量 当我尝试在另一个 单独的 类中创建类的实例时 我可以在方法中执行此操作 这是代码 import
  • C#:当一个字段可以是不同类型时反序列化 JSON

    我正在与返回包含 true false 或字符串数 组数组的 JSON 的 API 进行通信 我希望反序列化此 JSON 并将布尔值 如果有 存储在数据类型 bool 的名为 Success 的类字段中 并将数组 如果有 存储在自定义数据类
  • 建议使用 postgres 工具来查找模式和数据之间的差异

    各位 任何人都可以建议我使用 Linux 的 postgres 工具来查找2个给定数据库之间的差异 我尝试使用 apgdiff 2 3 但它给出了模式而不是数据方面的差异 但我两者都需要 提前致谢 比较数据并不容易 尤其是当您的数据库很大时
  • 重写 Objective-C 中的可变参数方法

    在 Objective C 中子类化时 在可变参数方法的情况下如何将调用转发到超类 我应该用什么来替换 下面发送我得到的所有对象 void appendObjects id firstObject super appendObjects 你
  • 如何在 Android 应用程序的 Activity 之间传递数据?

    我有一个场景 通过登录页面登录后 会出现注销button在各个activity 点击时sign out 我将通过session id登录用户的注销 谁能指导我如何保持session id所有人都可以使用activities 这种情况的任何替
  • 在 Python 中调用函数列表的惯用方式是什么?

    我有一个回调函数列表 当事件触发时我需要调用这些函数 这是惯用的Python吗 def first callback m print first m def second callback m print second m lst firs
  • 在状态计算中“不断转动曲柄”的有效方法

    我有一个有状态的进程 被建模为i gt RWS r w s a 我想给它一个输入cmds i 目前我做的是批发 let play runGame theGame go where go finished go v n cmds do end
  • 位置相关代码和位置无关代码有什么区别? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 位置相关代码和位置无关代码有什么区别
  • 获取下 N 个最近的地理点

    我在我的 Android 应用程序中有一个包含地理点的数据库表 纬度和经度是十进制度值 大约 1000 点 我需要选择距离某个给定地理点最近的 20 个点 我在 Stackoverflow 找到了如何计算两个地理点之间的距离的答案 并且非常
  • 使用 Capybara 存根浏览器时间和时区

    我有一个 JavaScript 组件 例如日期选择器 它很大程度上依赖于 当前系统时间 当前系统时区 在 Ruby 和 Capybara 中 可以在诸如Timecop https github com travisjeffery timec
  • iPhone core蓝牙中央管理器发送数据到外设

    我想将数据从 iPhone 发送到被发现并连接的蓝牙设备 我指的是this http weblog invasivecode com post 39707371281 core bluetooth for ios 6 core blueto
  • 方形网格 - XML

    在我的研究中 我必须编写一个 Android 应用程序来从气象站检索天气数据 这些将显示在块中 这些块将分成 4 列和 2 行 所以我想创建一个 4 列 2 行的方形网格来提供块 有人可以提供解决方案来帮助我创建这个网格吗 有很多选择 1
  • 为什么这段代码在 Windows 和 Linux 上打印出不同的结果?

    此代码在 Windows 和 Linux 之间打印不同的字符串 test py print join str i for i in range 10000 平台 x86 64 Linux 4 4 0 17763 微软Python版本 3 7