【问题标题】:Using newly installed modules without restarting an interactive session使用新安装的模块而不重新启动交互式会话
【发布时间】:2014-05-26 08:26:51
【问题描述】:

在长时间的交互会话期间(使用 ipython),我有时需要使用我尚未安装的模块。

安装新模块后,该模块可在新的交互式会话中导入,但不能在安装前运行的会话中导入。由于我正在使用内存中的所有变量,我不想重新启动会话......

我怎样才能获得这样一个以前运行的会话来导入新模块?

【问题讨论】:

    标签: python import


    【解决方案1】:

    在 Python 中有两种手动导入内容的方法(取决于您的 Python 版本)。

    # Python2
    import os
    os.chdir('/path')
    handle = __import__('scriptname') #without .py
    handle.func()
    

    或者你可以这样做:

    # Python3.3+
    import importlib.machinery
    loader = importlib.machinery.SourceFileLoader("namespace", '/path/scriptname.py') #including .py
    handle = loader.load_module("namespace")
    handle.func()
    

    这在以前版本的 Python3 中有点不同,现在没有时间或访问安装旧版本,但我确实记得在尝试导入时遇到了一些问题,尤其是在早期版本中重新加载模块。


    重新加载这些模块以防它们发生变化(只是为了详细说明这个答案):

    # Python2
    reload(handle)
    


    # Python3
    import imp
    imp.reload(handle)
    

    【讨论】:

    • 脚本名应该是什么?有问题的目录有一个 __init__.py 以及一堆其他 .py 和 .pyc 文件...
    • @Michael "scriptname.py" 然后执行handle = __import__('scriptname') #without .py 上面的代码,或者执行第二个选项。
    • namespace 是完整的模块名称。类似mymath.trig:SourceFileLoader("mymath.trig", '/home/idbrii/py/package/mymath/trig.py')
    【解决方案2】:

    这里是python3中顶级模块的一个稍微简单的答案:

    # import it to use it
    import modulename
    
    # reimport it with importlib
    import importlib
    print(importlib.reload(__import__("modulename")))
    

    在 python 3.9 上为我工作。我认为它只会重新导入顶级模块,因此您需要针对子模块的 SourceFileLoader 解决方案。

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 1970-01-01
      • 2019-05-13
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多