Python:sys.modules 关键点指向不同的模块,而不是它最初应该指向的模块
在 Python 3.8.10 上,我观察到以下情况:
Python 3.8.10 (default, Nov 26 2021, 20:14:08)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.27.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import sys
In [2]: keys = sorted([key for key in sys.modules if 'lino_medico.lib.courses' in key])
...: modules = tuple(
...: m
...: for m in map(sys.modules.__getitem__, keys)
...: )
In [3]: keys
Out[3]:
['lino_medico.lib.courses',
'lino_medico.lib.courses.desktop',
'lino_medico.lib.courses.models']
In [4]: sys.modules[keys[-1]]
Out[4]: <module 'lino_medico.lib.courses.desktop' from '/home/blurry/lino/env/repositories/medico/lino_medico/lib/courses/desktop.py'>
In [5]: sys.modules['lino_medico.lib.courses.models']
Out[5]: <module 'lino_medico.lib.courses.desktop' from '/home/blurry/lino/env/repositories/medico/lino_medico/lib/courses/desktop.py'>
In [6]: from importlib import import_module
In [7]: import_module(keys[-1])
Out[7]: <module 'lino_medico.lib.courses.desktop' from '/home/blurry/lino/env/repositories/medico/lino_medico/lib/courses/desktop.py'>
In [8]: keys[-1]
Out[8]: 'lino_medico.lib.courses.models'
In [9]: import weakref
In [10]: isinstance(import_module(keys[-1]), weakref.ProxyTypes)
Out[10]: False
如果您查看 Out[3]:
中的键,最后一个模块名称是 'lino_medico.lib.courses.models'
但在 Out[4]:
以及 Out[5]:
和 Out[7]:
中,关键点指向文件.../lino_medico/lib/courses/desktop.py
而不是 .../lino_medico/lib/courses/models.py
。
我感觉自己格格不入。任何有关解释这是如何发生的帮助将不胜感激。
On Python 3.8.10 I observe the following:
Python 3.8.10 (default, Nov 26 2021, 20:14:08)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.27.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import sys
In [2]: keys = sorted([key for key in sys.modules if 'lino_medico.lib.courses' in key])
...: modules = tuple(
...: m
...: for m in map(sys.modules.__getitem__, keys)
...: )
In [3]: keys
Out[3]:
['lino_medico.lib.courses',
'lino_medico.lib.courses.desktop',
'lino_medico.lib.courses.models']
In [4]: sys.modules[keys[-1]]
Out[4]: <module 'lino_medico.lib.courses.desktop' from '/home/blurry/lino/env/repositories/medico/lino_medico/lib/courses/desktop.py'>
In [5]: sys.modules['lino_medico.lib.courses.models']
Out[5]: <module 'lino_medico.lib.courses.desktop' from '/home/blurry/lino/env/repositories/medico/lino_medico/lib/courses/desktop.py'>
In [6]: from importlib import import_module
In [7]: import_module(keys[-1])
Out[7]: <module 'lino_medico.lib.courses.desktop' from '/home/blurry/lino/env/repositories/medico/lino_medico/lib/courses/desktop.py'>
In [8]: keys[-1]
Out[8]: 'lino_medico.lib.courses.models'
In [9]: import weakref
In [10]: isinstance(import_module(keys[-1]), weakref.ProxyTypes)
Out[10]: False
If you look at the keys in Out[3]:
the last module name is 'lino_medico.lib.courses.models'
but in Out[4]:
as well as in Out[5]:
and Out[7]:
the key points to the file .../lino_medico/lib/courses/desktop.py
instead of .../lino_medico/lib/courses/models.py
.
I am feeling out of my league here. Any help would be appreciated on explaining how this can happen.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
事实证明,存在一个错误(错误的来源在这里)在我们的代码上。
在这里,我们从
desktop.py
更新models.__dict__
(其中mn
是desktop.py
) 。其中有一些属性,例如__name__
、__spec__
、__loader__
、__file__
等被覆盖。解决方案:
我只需删除所有以双下划线 (
__
) 开头的内容。 解决方案代码。As it turned out there was a bug (source of the bug here) on our code.
Here, we were updating the
models.__dict__
fromdesktop.py
(wheremn
is thedesktop.py
). Which had some attributes like__name__
,__spec__
,__loader__
,__file__
and such that were being overwritten.Solution:
I just had to remove anything that starts with a double underscore (
__
). solution code.