调用 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 大喊大叫,希望他们能快速做出有益的回应。谢谢!
这真是难倒我了... 这是问题的核心:
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 大喊大叫,希望他们能快速做出有益的回应。谢谢!