PSYCHOPY错误:AttributeError: module 'logging'没有'getLogger'属性

13

我是Python和PsychoPy的新手,每次尝试运行实验时,都会出现以下错误:

File
"/private/var/folders/nb/k9sz30gj29l_7d8l6tmbcxhr0000gn/T/AppTranslocation/F9CCC296-B2DF-4D05-A6AE-F9DE0928FE0E/d/PsychoPy3.app/Contents/Resources/lib/python3.6/lib2to3/pgen2/driver.py", line 120, in load_grammar
    logger = logging.getLogger()
AttributeError: module 'logging' has no attribute 'getLogger'

我已经确认没有命名为logging.py的文件,但仍无法运行。演示程序却可以正常运行。

2
你可以运行 import loggingprint(logging.__file__) 吗? - Yang HG
8
你的项目中是否有名为“logging”的模块或包? - Klaus D.
3个回答

29

每当存在循环导入或任何其他没有getLogger的日志记录模块时,就会出现此类问题。尽管您说已经搜索了名为logging.py的文件,但我认为您的项目中某个地方有logging.py文件名。如果当前文件的名称为logging.py,请更改它,否则将会产生循环导入错误。尝试搜索Python库路径,如果仍然无法解决问题,则只剩下更改版本的选项。希望这可以帮到您。


1
我从另一个仓库复制了我的 logging.py 文件,那里它可以正常工作。不知道是什么让这个带有 AttributeError 的仓库与之前的不同。只是将文件重命名为 log.py,问题就解决了……但感觉自己并不理解发生了什么。 - V-R
2
可能不是 logging.py,而是 logging/__init__.py... - lindes
1
在我的情况下,重命名 logging 目录后,需要执行 pip uninstall 卸载该包,并重新安装。--upgrade --force-reinstall 不足以解决问题。 - James_SO
1
在我的情况下,它是 string.py,所以我将其重命名为 stringsession.py - Spidy

4

这个问题的一个可能解决方案(取决于具体细节)与代码运行的位置有关--需要进行更改。例如:

如果我有一个名为test的小型实用程序,旨在从命令行运行(它以指定某些Python或其他内容的"shebang"行开头),并将其放置在Python模块的目录中(例如,pythonX.Y/site-packages/whatever),该目录层次结构内部有一个logging模块(即,在whatever目录层次结构中的某个地方有一个logging.pylogging/__init__.py),然后尝试运行它(通过例如,在whatever目录中使用./test - 或者甚至在同一site-packages中的其他位置,我不确定),我会得到你描述的错误。

如果我从pythonX.Y/site-packages/whatever目录中复制同样的文件,并尝试在其他地方运行它(例如,将其复制到我的主目录并作为~/test运行),那么它就可以正常工作。反之亦然:在~中工作的脚本,如果我将其复制到pythonX.Y/site-packages/whatever中,它就会崩溃。这也可能适用于除了shebang脚本(例如python -m whatever ...或类似方式)之外的其他调用方式...总之,如果与您要运行代码的文件附近有logging模块,则Python很可能会尝试导入该版本的logging而不是通常的系统版本。
对于模块所有者,建议考虑将模块的logging重命名为其他名称,以避免为用户创建此问题。
对于普通用户,只需注意您从哪里调用代码(包括文件在文件系统上的物理位置,相对于可能被导入的各种模块)。
希望这能帮助有需要的人解决错误!它曾经困扰了我一段时间,而这就是适合我的解决方案。

[0] 注意:仅创建symlink是不够的...尽管在另一个方向上这样做可能很有用;无论哪种方式,Python都会找到常规文件的绝对路径,并且此分析的其余部分适用于该文件所在的位置:在模块内获取模块的logging;在模块外获取系统的logging


-1
今天遇到了这个问题,我的代码库中有一个名为logging.py的文件。只有在我不使用调试模式运行Python代码时才会出现这个错误。如果我在VSCODE中使用调试器,就不会出现这个错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接