IIS下的Python FastCGI - stdout编写问题

时间:2008-12-10 14:04:51

标签: python iis stdout fastcgi

我的Python FastCGI代码中有一个非常奇怪的问题 - sys.stdout的文件描述符为'-1',所以我无法写入它。 我在我的程序的第一行检查这个,所以我知道这不是我的任何代码改变它。

我已经尝试了sys.stdout = os.fdopen(1, 'w'),但那里写的任何内容都无法访问我的浏览器。

同样的应用程序在Apache下没有任何困难。

我正在使用Microsoft提供的针对IIS的FastCGI扩展程序: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 个答案:

答案 0 :(得分:1)

我认为stdout已关闭/无效符合FastCGI spec

  

Web服务器只保留一个文件   描述符,FCGI_LISTENSOCK_FILENO,   在应用程序开始时打开   执行。该描述符指的是a   由Web创建的侦听套接字   服务器。

     

FCGI_LISTENSOCK_FILENO等于   STDIN_FILENO。标准描述符   STDOUT_FILENO和STDERR_FILENO是   申请开始时关闭   执行。一种可靠的方法   申请确定是否   使用CGI或FastCGI调用   呼叫   getpeername(FCGI_LISTENSOCK_FILENO),   在errno设置为的情况下返回-1   ENOTCONN用于FastCGI应用程序。

答案 1 :(得分:1)

请原谅我这是一个愚蠢的问题,但我在配置文件中注意到这一行:

  

参数= -u C:\ app \ app_wsgi.py

您运行的是WSGI应用程序还是FastCGI应用程序? 的区别。在WSGI中,写入stdout并不是一个好主意。您的程序应该有一个可以使用环境dict和start_response函数调用的应用程序对象(有关详细信息,请参阅PEP 333)。无论如何,你的应用程序的返回方法是返回一个包含响应体的可迭代对象,而不是写入stdout。

无论哪种方式,您还应该考虑使用isapi-wsgi。我自己从未使用它,但我听到了很多好消息。

答案 2 :(得分:1)

你必须使用FastCGI吗?如果没有,您可能想尝试ISAPI WSGI方法。我成功使用了:

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

并且过去也使用过PyISAPIe:

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

答案 3 :(得分:0)

在PEP 333之后,你可以尝试登录environ ['wsgi.errors'],当你使用fastcgi时,它通常是web服务器本身的记录器。当然,这仅在调用请求时可用,但在应用程序启动期间不可用。

您可以在pylons代码中获取示例:http://pylonshq.com/docs/en/0.9.7/logging/#logging-to-wsgi-errors

答案 4 :(得分:0)

在Windows上,可以启动没有有效stdin和stdout的进程。例如,如果你用pythonw.exe执行python脚本,stdout就是invdalid,如果你坚持写它,它会在140个字符之后阻塞。

写入除stdout之外的其他目的地看起来是最安全的解决方案。

豫ICP备18024241号-1