ImportError:无法导入名称 NullHandler
Posted
技术标签:
【中文标题】ImportError:无法导入名称 NullHandler【英文标题】:ImportError: cannot import name NullHandler 【发布时间】:2015-01-12 09:27:59 【问题描述】:我正在尝试在 Elastic Beanstalk 上部署一个 hello-world 类型的应用程序。几乎一切似乎都正常工作,安装了软件包等等,直到 mod_wsgi 尝试从 wsgi.py 检索“应用程序”对象。此时,日志中会出现以下内容(每个不成功的 HTTP 请求的日志中都会出现一次):
mod_wsgi (pid=6114): Target WSGI script '/opt/python/current/app/myapp/wsgi.py' cannot be loaded as Python module.
mod_wsgi (pid=6114): Exception occurred processing WSGI script '/opt/python/current/app/myapp/wsgi.py'.
Traceback (most recent call last):
File "/opt/python/current/app/caserails/wsgi.py", line 20, in <module>
application = get_wsgi_application()
File "/opt/python/run/venv/lib/python2.7/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application
django.setup()
File "/opt/python/run/venv/lib/python2.7/site-packages/django/__init__.py", line 18, in setup
from django.utils.log import configure_logging
File "/opt/python/run/venv/lib/python2.7/site-packages/django/utils/log.py", line 16, in <module>
from logging import NullHandler # NOQA
ImportError: cannot import name NullHandler
Link to concurrent AWS Forum Post.
【问题讨论】:
【参考方案1】:NullHandler
仅适用于 Python 2.7+ 版本。您可以在ImportError
上自己创建NullHandler
:
import logging
try:
from logging import NullHandler
except ImportError:
class NullHandler(logging.Handler):
def emit(self, record):
pass
logging.getLogger(__name__).addHandler(NullHandler())
更多关于logging.NullHandler
的信息:https://docs.python.org/3/library/logging.handlers.html#logging.NullHandler。
【讨论】:
感谢@Roald,它为我们工作。诀窍是我们必须转到以下位置:C:\Python27\Lib\site-packages\urllib3 在这里,在初始化文件中,我们只是将代码粘贴到它所在的位置以尝试除块【参考方案2】:我有类似的问题,就我而言,问题是我在主文件夹中创建了一些不相关的项目 logging.py 文件,当我在家中运行某些东西时,它正在导入这个文件而不是真正的模块。
您可以像这样检查正在导入的文件:
import logging
print(logging.__file__)
我通过删除之前创建的 logging.py 来修复它。
【讨论】:
【参考方案3】:NullHandler 是在 2.7 版本中引入的。你确定你的服务器上运行的是 2.7 吗?
【讨论】:
当然是著名的遗言。 . .但是,我确实将一些 syslog 语句放入我的 wsgi.py 文件中以尝试查看(例如 syslog.syslog('sys.executable: '.format(sys.executable)); ),并且当我运行 python它返回(例如-V)它说我的python可执行文件是2.7.5。 为什么你的回溯有/opt/python/current/...
路径和/opt/python/run/venv/...
呢?某种 virtualenv 配置错误?
我认为所有不同的 python 路径都是 AWS 的 EB 环境如何设置 virtualenvs 以在 mod_wsgi 下运行的产物。 Here is some documentation from Google on it.。可能存在三种代码源。 . . AWS Elastic Beanstalk 基线环境(不应在此处直接访问,而是运行 mod_wsgi 解释器的“环境”)、虚拟环境(在 venv 中)和我的应用程序(在当前)【参考方案4】:
经过多次尝试和错误,通过从 requirements.txt 中删除 python logging 并重建环境来解决(直接)问题。
我还不完全明白为什么这是一个问题。在我的本地机器上,我可以安装日志并运行 Django 而不会出错。我怀疑正如 vikramls 指出的那样,在 mod_wsgi、执行 mod_wsgi 的 baselineenv 和运行我的应用程序的 virtualenv 之间的交集处发生了一些奇怪的事情。
但是,至少目前,我正在通过在 Elastic Beanstalk 上部署 Django 1.7 时在 requirements.txt 中不包含“日志记录”来修复此错误。
【讨论】:
【参考方案5】:我在使用 PyInstaller 为 python 2.7 创建构建时遇到了这个问题。所以,我从我的 ENV 中卸载了记录器。否则你也可以从 require.txt 中删除包名称。 这种方法解决了我的问题[Happy Coding:)]
【讨论】:
以上是关于ImportError:无法导入名称 NullHandler的主要内容,如果未能解决你的问题,请参考以下文章
ImportError:无法导入名称“AFAVSignature”
ImportError:无法导入名称“评估”(来自意外导入评估)
Django 'ImportError: 无法导入名称 url'