python-3.x 调用serve_forever()时打印语句不工作?[duplicate]

wi3ka0sx  于 2023-01-06  发布在  Python
关注(0)|答案(3)|浏览(133)

此问题在此处已有答案

Python not printing output(1个答案)
3天前关闭。
我有下面的小python脚本运行本地服务器测试一些html:

print('opened')

from http.server import HTTPServer, SimpleHTTPRequestHandler

server_address = ('', 8000)
httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)

print("Listening at https://127.0.0.1:8000/ . . .")
httpd.serve_forever()

当我在终端中运行它时,它阻塞了print语句:什么都没有打印出来。但是服务器可以工作,我可以在浏览器中转到localhost:8000并访问我的html文件。但是,如果我注解掉最后一行,对serve_forever()的调用,它就可以工作,打印openedListening at https:127.0.0.1:8000/ . . .。当然,它实际上并不工作,因为现在服务器没有运行。
我觉得这很令人困惑。前几行在最后一行之前执行。为什么最后一行会导致前几行不起作用?
如果有人要问的话,我会问Windows7上的Python3,但我怀疑这是否相关。

mzmfm0qo

mzmfm0qo1#

这可能与“臭名昭著”的需要冲洗,以使您的打印工作!

因为您使用的是Python 3,并且从3.3版本开始,您不必遵循上面给出的答案。
打印内置类型有一个选项flush,默认情况下为False

print('opened', flush=True)

from http.server import HTTPServer, SimpleHTTPRequestHandler

server_address = ('', 8000)
httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)

print('Listening at https://127.0.0.1:8000/ . . .', flush=True)
httpd.serve_forever()

PS:这是一个类似问题的确认解决方案

huus2vyu

huus2vyu2#

有几个解决这个现象:

禁用输出缓冲

用write模式重新打开stdout文件描述符,0作为缓冲区大小(unbuffered),我建议把这一行写为代码的第一行,这样,除了stdout缓冲区之外,所有代码都将保持不变:

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

使用无缓冲二进制标准输出和标准错误运行python

强制stdout和stderr流的二进制层(可用作其buffer属性)为非缓冲。如果写入控制台,则文本I/O层仍将为行缓冲,如果重定向到非交互文件,则为块缓冲。
因此,只需像这样运行脚本:

python -u <your_pyScript>

或者通过设置环境变量PYTHONUNBUFFERED

flush关键字参数设置为true

从Python 3.3开始,你可以强制普通的print()函数刷新,而不需要使用sys.stdout.flush(),只需将“flush”关键字参数设置为true即可:

print("...", flush=True)

将一个模块中的默认值更改为flush=True

可以在模块的全局作用域上使用functools.partial来更改print函数的默认值:

import functools
print = functools.partial(print, flush=True)

我们可以看到它的工作原理和预期的一样:

>>> print('foo')
foo
wfypjpf4

wfypjpf43#

import logging
logging.info('Listening at https://127.0.0.1:8000/ . . .')

嗨,请考虑使用日志记录而不是打印,你不想麻烦打印语句的所有缺点。打印是为初学者准备的,可能是为交互模式准备的。所有专业的服务器端编码器都依赖日志记录。
检查In python, why use logging instead of print?以获得日志记录良好性的完整列表。

相关问题