启动交互式 shell 时的导入问题

1 投票
3 回答
729 浏览
提问于 2025-04-15 18:37

当我通过执行

python -v manage.py shell

在项目目录中启动交互式的 Django shell 时,我看到很多格式为 django.package.module 的模块在详细输出中被导入,但我仍然需要手动导入它们才能在 shell 中使用。

同样的情况也发生在我运行 Python shell(带 -v 参数)时。例如,我在详细输出中看到这个:

import os # precompiled from /usr/local/gdp/lib/python2.4/os.pyc

但我仍然需要执行 import os 来导入并使用 os 模块。那么在详细输出中我看到的那些被导入的东西是什么?为什么我还需要再次手动导入它们才能在 shell 中使用?是 Python 在启动 shell 时加载了一些必要的模块,还是说这是某种幕后魔法?

3 个回答

0

当你启动Python的时候,它会自动加载一个叫做 site 的模块。这个模块可能会为了自己需要而再去加载其他模块。如果你不想让它这样做,可以在启动时加上 -S 这个选项。

0

这些模块已经被导入了(你可以查看 sys.modules),在导入它们的模块中会创建对这些模块的引用。

当你在命令行中进行导入时,如果这个模块已经被导入过了,你得到的只是对它在 sys.modules 中的一个引用的副本。

1

-v 用来追踪一个模块的第一次导入,也就是实际加载这个模块的过程(执行它的代码,这可能需要一点时间),并把它放进 sys.modules 里。

这和你的交互式会话(模块 __main__)是否能使用这个模块没有任何关系。为了确保模块 'goo' 确实能进入模块 'X' 的命名空间(对于任何 X,当然也包括 __main__ 以及其他很多模块),模块 'X' 只需要自己 import goo 一下(如果 sys.modules['goo'] 已经存在,这个操作非常快!)。

撰写回答