ImportError:无法导入名称“ getLogger”

时间:2018-11-03 02:11:57

标签: python import

这个问题已经在这里有了答案: python & suds “ImportError: cannot import name getLogger”

但似乎我遇到了无法用答案解释的情况。

这是细节:

我有一个名为logging.py的文件。代码如下:

import sys
print(sys.path)
from logging import getLogger

我知道我是否运行python3 logging.py,它将无法工作。因为python会尝试在sys.path中搜索目录以查找日志记录模块。这样,sys.path [0]将成为脚本的目录,以便python将直接从脚本目录加载日志记录模块,而不是搜索python标准lib。

此处输出:

# chuck @ LAPTOP-RN92LIAI in ~/editable_package/test_py [12:01:43]
$ python3 logging.py
['/home/chuck/editable_package/test_py', '/usr/lib/python36.zip', 
'/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', 
'/home/chuck/.local/lib/python3.6/site-packages', 
'/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']
.....
ImportError: cannot import name 'getLogger'

因此,我尝试将文件作为python3 -m logging运行,我希望sys.path没有模块的目录,以便python在sys.path中搜索标准lib的目录。

但是,结果表明sys.path是预期的,但是python搜索的模块不是:

:!python3 -m logging
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib- 
dynload', '/home/chuck/.local/lib/python3.6/site-packages', 
'/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']
...
Traceback (most recent call last):
  File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
  "__main__", mod_spec)
 File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
 File "/home/chuck/editable_package/test_py/logging.py", line 3, in <module>
    from logging import getLogger
  File "/home/chuck/editable_package/test_py/logging.py", line 3, in 
  <module>
   from logging import getLogger
 ImportError: cannot import name 'getLogger'

对此我感到困惑。只是不知道为什么。任何建议将不胜感激。

5 个答案:

答案 0 :(得分:1)

问题在于您已将文件命名为“ logging.py”,这使其看起来像Python原生的“ logging”模块。当您运行文件时,它将尝试从自身导入getLogger,因为该文件未在其中定义,因此无法正常工作。重命名文件即可使用。

答案 1 :(得分:0)

log = logging.getLogger(name)
log.info("this is info log")

这是我们如何初始化变量才能登录我们的应用程序的方法。 “名称”通常是指模块。

答案 2 :(得分:0)

当您编写python3 -m module_name python时,在具有标准库的文件夹中搜索module_name,并从标准库中找到不是您的logging模块,而是其他模块。

运行简单:

cd /to/folder/with/your/logging.py
python3 logging.py

python3 /path/to/your/logging.py

并重命名文件,以避免与标准库冲突。

答案 3 :(得分:0)

python在带有文件的文件夹中查找logger.py 带有变量__name__ == 'main' 它总是直接运行的文件,但是flask不直接运行loggin.py, 它导入它们, 并且他们的解释器在未放置文件的项目的根目录中运行,请理解命令from logging import getLogger,例如-

“从current_dir(带有__naim__ == 'main'文件)中导入getLogger

如果文件不是此处,则=>来自PYTHONPATH”

确保您可以在文件中添加getLogger,错误将消失:

import sys
print(sys.path)

class getLogger(object):
    """"""

from logging import getLogger    # tryin to import from self

答案 4 :(得分:0)

我终于明白了发生了什么,感谢@Cory Nezin和@Andrey Suglobov。

当python尝试搜索模块时,它将按顺序在sys.path中搜索目录。如果sys.path [0]为”,则并不意味着python将跳转并搜索另一个目录。相反,它将尝试搜索当前目录。

这里是docs

  

在程序启动时初始化,此列表的第一项path [0]是包含用于调用Python解释器的脚本的目录。如果脚本目录不可用(例如,以交互方式调用解释器或从标准输入中读取脚本),则path [0]为空字符串,它指示Python首先在当前目录中搜索模块。

因此,例如,如果您位于/ home中,其中包含一个名为logging.py的文件并运行:python3 -m logging,则当前目录为/ home,而python将首先搜索/ home中的所有模块。这就是为什么我会收到这样的错误:ImportError:无法导入名称“ getLogger”。

但是,如果您在/ home中并运行以下命令行:

mkdir test
touch test/__init__.py

并将logging.py放入测试目录,然后运行:python3 -m test.logging, 当前目录为/ home(确保在/ home中没有名为logging的文件),并且python在该目录中找不到日志记录模块。因此,python将导入标准库。它将最终正常工作。