Python错误:输入提示中的空字节

10

我发现

input('some\x00 text')

将提示输入 some 而不是 some text

根据消息来源,我已经了解到这个函数使用 C 函数 PyOS_Readline,它忽略空字节后的提示信息。

来自 PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt):

fprintf(stderr, "%s", prompt);

https://github.com/python/cpython/blob/3.6/Python/bltinmodule.c#L1989 https://github.com/python/cpython/blob/3.6/Parser/myreadline.c#L251

这是一个bug吗,还是有其他原因?

问题链接: http://bugs.python.org/issue30431


4
据我所知,在Python中,NULL字节不是终止符,因此输入应该打印整个字符串。 - Kostya Cholak
2
例如,print('some\0 text')将打印出 some text - Kostya Cholak
3
@Костя Чолак,您没有理解Torek的观点。这不是Python中的终止字符,而是Python调用readline(),而readline()是用C编写的,因此遵循C规则。 Python将整个字符串“ some\x00 text”传递给readline(),然后readline()将其截断。 - BoarGules
2
创建的问题: http://bugs.python.org/issue30431 - Kostya Cholak
4
操作系统提供的readline函数必须知道提示符,以便于每当readline需要时(这经常发生)可以重新打印它。对于提示符本身的另一个选项是让Python删除空字符并将剩余部分传递给readline,但我不确定这是否是一种改进。 - torek
显示剩余5条评论
1个回答

2

这个函数的签名要求一个以NUL结尾的C字符串:PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt),因此如果不改变API并破坏与GNU readline的互操作性,就没有太多可以做的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接