这个问题已经在这里有了答案: 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'
对此我感到困惑。只是不知道为什么。任何建议将不胜感激。
答案 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将导入标准库。它将最终正常工作。