启动交互式 shell 时的导入问题
当我通过执行
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']
已经存在,这个操作非常快!)。