调用 sys.stderr.fileno(),在检查它是一个 python callable() 之后,会引发 AttributeError?

Calling sys.stderr.fileno(), after checking it is a python callable(), raises an AttributeError?

这真是难倒我了... 这是问题的核心:

if hasattr(sys.stderr, 'fileno'):
    if callable(sys.stderr.fileno):
       i = sys.stderr.fileno()

当这条语句执行时,2 个条件通过,但是对 fileno() 的调用以 AttributeError 炸弹!!不相信我?这是堆栈转储:

Request Method: GET Request URL:

https://XXXX/YYYY/abcdef/hazards/NSP-F15-22/pdf/

Django Version: 1.8.3 Python Version: 3.4.0 Installed Applications: ('django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', 'django.contrib.flatpages', 'crispy_forms', 'wkhtmltopdf', 'ckeditor', ...) Installed Middleware: ('django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware')

Traceback: File "/usr/local/lib/python3.4/dist-packages/django/core/handlers/base.py" in get_response 164. response = response.render() File "/usr/local/lib/python3.4/dist-packages/django/template/response.py" in render 158. self.content = self.rendered_content File "/usr/local/lib/python3.4/dist-packages/wkhtmltopdf/views.py" in rendered_content 148.footer_filename=footer_filename) File "/usr/local/lib/python3.4/dist-packages/wkhtmltopdf/views.py" in convert_to_pdf 107. return wkhtmltopdf(pages=[filename], **cmd_options) File "/usr/local/lib/python3.4/dist-packages/wkhtmltopdf/utils.py" in wkhtmltopdf

101. i = sys.stderr.fileno()

Exception Type: AttributeError at /abcdef/hazards/NSP-F15-22/pdf/

Exception Value: 'mod_wsgi.Log' object has no attribute 'fileno'

这一切在我们的开发环境中运行良好 运行 django 开发服务器(即不使用 wsgi)。但是在我们的生产环境中。我们在 Ubuntu 上使用 mod_wsgi 在 apache 上提供 Django 应用程序。所有软件最新稳定版本 (Ubuntu 14.04, python 3.4, django 1.8, libapache2-mod-wsgi-py3 3.4-4ubuntu2.1.14.04.2)。

问题似乎源于 wsgi 将 sys.stderr 替换为 mod_wsgi.Log 对象。 回到 2013 年,在 django-wkhtml2pdf 中添加了一个补丁来解决这个问题...... 参见:https://github.com/incuna/django-wkhtmltopdf/pull/40

不幸的是,正如你从我的代码中看到的那样,sys.stderr 确实有一个 'fileno' 属性并且 fileno 属性是可调用的,但是当你去调用它时,Python 引发如上所示的 AttributeError 异常。

我无计可施 - 一定是漏掉了一些非常愚蠢的东西。对于可能是什么原因或下一步要查找的任何提示,我们将非常感激。

此问题似乎是由 python 3 或与 python 3 不兼容引起的。错误报告目前在 https://github.com/GrahamDumpleton/mod_wsgi/issues/85.

队列中

向 Kevin 和 Graham 大喊大叫,希望他们能快速做出有益的回应。谢谢!