【问题标题】:imports while starting an interactive shell在启动交互式 shell 时导入
【发布时间】:2010-01-29 06:00:10
【问题描述】:

当我通过manage.py启动交互式django shell时,通过执行

python -v manage.py 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 时会加载一些基本模块还是某种幕后魔法?

【问题讨论】:

    标签: python django shell import


    【解决方案1】:

    -v 跟踪模块的 first 导入——实际加载模块的那个(执行其代码,因此可能需要一些时间)并将其粘贴到sys.modules

    当然,无论您的交互式会话(模块__main__)是否将模块注入到其命名空间中,这没有可做。为了确保模块 'goo' 确实 进入模块 'X' 的命名空间(对于 any X,所以当然包括 @987654327 @... 等等),模块'X' 只需要import goo 本身(如果sys.modules['goo'] 已经定义,确实是一个非常快速的操作!-)。

    【讨论】:

    • 所以 -v 显示的是将模块添加到 sys.modules 并使其在当前模块命名空间中可用,需要在模块范围内导入它。这回答了我的问题,谢谢。
    【解决方案2】:

    Python 在启动时会隐式加载site 模块,这可能会导入其他模块供自己使用。您可以通过-S 来禁用此行为。

    【讨论】:

      【解决方案3】:

      它们正在被导入(查看 sys.modules),并且在导入它的任何模块中都会创建对模块的引用。

      当你在你的 shell 中做一个导入时,如果模块已经被导入了,你只会在 sys.modules 中得到一个对它的引用的副本

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-05
        • 2020-08-15
        • 1970-01-01
        • 2012-08-15
        • 2013-02-03
        • 2017-06-04
        • 2011-07-24
        • 2011-06-19
        相关资源
        最近更新 更多