调用serve_forever()时打印语句不起作用?

时间:2017-04-04 02:59:25

标签: python python-3.x simplehttpserver

我有以下小的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()的来电,则可以正常打印“打开”'和'在https:127.0.0.1:8000 /上收听。 。 。&#39 ;.当然,它实际上并不是工作,因为现在服务器还没有运行。

我觉得这很令人困惑。前一行在最后一行之前执行。为什么最后一行会导致前一行不起作用?

Windows7上的Python3,如果有人要问,但我怀疑这是否相关。

3 个答案:

答案 0 :(得分:6)

这可能与"臭名昭着的"需要刷新才能让您的打印件正常工作!

相关阅读材料:

<小时/> 因为您使用的是Python 3,从版本3.3开始,您不必遵循上述优秀答案中给出的解决方案。
python `print` does not work in loop有一个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:print build-in type

答案 1 :(得分:6)

有这种现象的几种解决方案:

禁用输出缓冲

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

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

使用无缓冲的二进制stdout和stderr运行python

强制stdout和stderr流的二进制层(可用作缓冲区属性)无缓冲。如果写入控制台,文本I / O层仍将是行缓冲的,如果重定向到非交互式文件,则仍然是块缓冲的。

所以只需像这样运行你的脚本:

python -u <your_pyScript>

或者通过设置环境变量PYTHONUNBUFFERED

flush关键字参数设置为true

从Python 3.3开始,你可以强制普通print()函数进行刷新而不需要使用sys.stdout.flush()只需设置&#34; flush&#34;关键字参数为true:

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

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

您可以在模块的全局范围内使用functools.partial来更改打印功能的默认值:

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

我们可以看到它的效果与预期一致:

>>> print('foo')
foo

答案 2 :(得分:4)

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

嗨,请考虑使用日志而不是打印,您不需要担心print语句的所有缺点。打印适用于初学者,可能是交互模式,所有服务器编码器都依赖于日志记录。

检查 In python, why use logging instead of print?获取完整的日志记录列表。