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:无法导入名称“WebClient”

ImportError:无法导入名称“AFAVSignature”

ImportError:无法导入名称“评估”(来自意外导入评估)

Django 'ImportError: 无法导入名称 url'

ImportError:导入 PCA 时无法导入名称“LatentDirichletAllocation”[关闭]

如何修复“ImportError:无法导入名称'StringIO'”