首页 > 解决方案 > 程序退出后没有换行符的 Python 2.6 打印

问题描述

在我的代码中,我试图在程序退出后不换行打印并再次打印。例如,我用逗号打印:

type_d=dict.fromkeys(totals,[0,0])
for keysl in type_d.keys():
    print type_d[keysl][0] , ",", type_d[keysl][1] , ",",
print "HI" ,

但是当程序退出并且我调用另一个程序时,在文件中的最后一个值之后输入了一个换行符。我怎样才能避免这种情况?

标签: pythonpython-2.x

解决方案


我相信这没有记录,但它是故意的,并且与记录的行为有关

print如果您在文档中查找:

在每个对象被(转换和)写入之前写入一个空格,除非输出系统认为它位于行首。情况如下:(1) 尚未将字符写入标准输出,(2) 写入标准输出的最后一个字符是除 ' ' 之外的空白字符,或 (3)标准输出上的最后一个写入操作是不是打印声明。(在某些情况下,出于这个原因,将空字符串写入标准输出可能会起作用。)

Python 确实会跟踪最后写入的内容是否sys.stdoutprint(包括 by print >>sys.stdout)写入(除非sys.stdout不是实际的文件对象)。(请参阅PyFile_SoftSpaceC API 文档。)上面的 (3) 就是这样。

它也是用来决定是否在关闭时打印换行符的stdout

因此,如果您不希望最后换行,您可以在程序末尾执行 (3) 中提到的相同解决方法:

for i in range(10):
    print i,
print 'Hi',
sys.stdout.write('')

现在,当你运行它时:

$ python hi.py && python hi.py
0 1 2 3 4 5 6 7 8 9 Hi0 1 2 3 4 5 6 7 8 9 Hi

如果您想查看负责的来源:

PRINT_ITEM字节码处理程序ceval是设置“软空间”标志的地方。

根据标志检查和输出换行符的代码是Py_FlushLine(Python的许多其他部分也使用它)。

我相信,调用该检查的代码是handle_system_exit——但请注意,用于在同一文件中运行 Python 代码的各种不同的“非常高级 C API”函数最后也会做同样的事情。


推荐阅读