Python中,sys.stdin何时为None?

6

我正在尝试通过IIS将Flask作为一个简单的CGI应用程序运行。

我有以下代码:

from wsgiref.handlers import CGIHandler
from flask import Flask
app = Flask(__name__)

@app.route('/')
def main():
    return 'Woo woo!'

CGIHandler().run(app)

我在Windows上运行Python 3.3。 我收到以下错误:

File "C:\Python33\lib\wsgiref\handlers.py", 
line 509, in __init__(self, sys.stdin.buffer, sys.stdout.buffer, sys.stderr, )
AttributeError: 'NoneType' object has no attribute 'buffer' ".

我添加了一些日志代码,结果发现 sys.stdinNone
Python 作为 CGI 处理程序添加到 IIS 中,如下所示:
Request path: *.py
Executable: C:\Windows\py.exe -3 %s %s

所以,为什么sys.stdin是None,我该怎么解决?
编辑
看起来sys.stdin是None是因为文件描述符无效

在将一个包含多个Python CGI脚本的现有网站从Apache迁移到IIS时,我注意到没有提供任何表单数据的POST请求的stdin为None。 - Sergey Nudnov
1个回答

6

有趣。你已经回答了问题的一半。另一半(“我该如何修复它”)很容易,只需打开一些适当的内容(os.devnull是显而易见的选择),并将sys.stdin设置为指向该位置。你可能还需要对sys.stdout和sys.stderr进行设置,因此可以像这样操作:

import os, sys
for _name in ('stdin', 'stdout', 'stderr'):
    if getattr(sys, _name) is None:
        setattr(sys, _name, open(os.devnull, 'r' if _name == 'stdin' else 'w'))
del _name # clean up this module's name space a little (optional)
from wsgiref.handlers ...

这个应该能解决问题。


这实际上是我的一半解决方案 - 另一半是使用 IISCGIHandler(),因为显然 IIS 存在一些问题。此外,我只是用 os.devnull 替换了 stdin,生活变得美好了。 - Wayne Werner
@WayneWerner,能否请您指导一下IISCGIHandler()是什么?这是您创建的函数/类吗?能否分享一下? - Sergey Nudnov
@SergeyNudnov 快速搜索“python iiscgihandler”得到了https://docs.python.org/3/library/wsgiref.html#wsgiref.handlers.IISCGIHandler。 - Wayne Werner

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