Python FastCGI 在IIS下 - stdout写入问题

2 投票
5 回答
3333 浏览
提问于 2025-04-11 20:49

我在用Python写FastCGI代码时遇到了一个很奇怪的问题——sys.stdout的文件描述符是'-1',所以我无法往里面写东西。我在程序的第一行就检查过这个,所以我知道不是我的代码在改它。

我试过用sys.stdout = os.fdopen(1, 'w'),但是写进去的内容在我的浏览器里看不到。

同样的应用在Apache下运行没有任何问题。

我使用的是微软提供的FastCGI扩展,适用于IIS,具体文档可以在这里找到:http://learn.iis.net/page.aspx/248/configuring-fastcgi-extension-for-iis60/

我在fcgiext.ini里使用了这些设置:

    ExePath=C:\Python23\python.exe
    Arguments=-u C:\app\app_wsgi.py
    FlushNamedPipe=1
    RequestTimeout=45
    IdleTimeout=120
    ActivityTimeout=30

有没有人能告诉我哪里出错了,或者我应该去哪里找答案?

非常感谢所有的建议...

5 个回答

1

我认为在程序运行时,标准输出(stdout)被关闭或无效是符合FastCGI规范的:

当应用程序开始执行时,Web服务器会保留一个文件描述符,叫做FCGI_LISTENSOCK_FILENO,这个描述符指向一个由Web服务器创建的监听套接字。

FCGI_LISTENSOCK_FILENO等于STDIN_FILENO。标准描述符STDOUT_FILENO和STDERR_FILENO在应用程序开始执行时会被关闭。一个可靠的方法来判断应用程序是通过CGI还是FastCGI调用的,就是调用getpeername(FCGI_LISTENSOCK_FILENO),如果是FastCGI应用程序,这个调用会返回-1,并且errno会被设置为ENOTCONN。

1

你一定要使用FastCGI吗?如果不一定的话,可以试试ISAPI WSGI的方法。我之前用过这个,效果不错:

http://code.google.com/p/isapi-wsgi/

我之前还用过PyISAPIe:

http://sourceforge.net/apps/trac/pyisapie

1

请原谅我问这个问题,如果这很傻的话,但我注意到你配置文件中的这一行:

Arguments=-u C:\app\app_wsgi.py

你是在运行一个WSGI应用程序还是FastCGI应用程序?这两者是有区别的。在WSGI中,直接写入标准输出(stdout)并不是个好主意。你的程序应该有一个应用对象,这个对象可以接收一个环境字典和一个启动响应的函数(想了解更多,可以查看PEP 333)。总之,你的应用程序应该通过返回一个可迭代的对象来提供响应内容,而不是直接写入标准输出。

无论如何,你也应该考虑使用isapi-wsgi。我自己没用过,但听说它不错。

撰写回答