【问题标题】:how to test if one python module has been imported?如何测试是否已导入一个 python 模块?
【发布时间】:2011-06-28 23:31:43
【问题描述】:

如何在python中测试一个模块是否已经导入?

例如,我需要基础知识:

if not has_imported("sys"):
   import sys

还有

if not has_imported("sys.path"): 
   from sys import path

谢谢!

Rgs.

感谢您的所有 cmets: 代码被粘贴在这里。 auto import all sub modules in a folder then invoke same name functions - python runtime inspect related

【问题讨论】:

  • 我无法想象在任何情况下您都必须担心重新加载模块的性能。首先是因为无论你做什么它们都很慢,其次是因为如果你需要频繁地重新加载一个模块以至于它有性能问题,那么你做的事情就非常错误。我敢打赌,你找错了树,你试图以完全错误的方式解决问题。请始终解释为什么您觉得需要解决您想要解决的问题。它可以帮助您获得让您走上正轨的答案。
  • 谢谢,代码贴在这里:stackoverflow.com/questions/5037468/…

标签: python testing module import


【解决方案1】:
from sys import modules
try:
    module = modules[module_name]
except KeyError:
    __import__('m')   

这是我在运行时更改代码的解决方案!

【讨论】:

    【解决方案2】:

    我觉得已经接受的答案并不完全正确。

    Python 在多次导入同一个模块时仍然有开销。 Python 处理它不会给你一个错误,当然,但这并不意味着它不会减慢你的脚本。正如您将在下面的 URL 中看到的那样,多次导入模块时会有显着的开销。

    例如,在您可能不需要某个模块的情况下,除非在特定条件下,如果该模块很大或开销很大,那么有理由仅在条件下导入。这并不明确意味着你是一个马虎的编码员。

    https://wiki.python.org/moin/PythonSpeed/PerformanceTips#Import_Statement_Overhead

    【讨论】:

    • 使用 CPython v3.5.1,每次调用的开销仅为约 3ns。用%timeit '''import json; json.dumps(data)'''import json; %timeit '''json.dumps(data)'''data = ['foo', {'bar': ('baz', None, 1.0, 2)}] 测试。
    • 是的,这是有道理的。但是您正在加载的特定模块也可以在那个时候产生影响。因为当您导入模块时,代码会立即运行 - 诸如 defclass 之类的关键字正在积极加载并运行。这就是我们拥有if __name__ == "__main__": 位的原因,因此除非您直接调用该代码,否则该代码不会运行。所以说实话,我不确定后续对模块的调用是否仍然运行代码......
    • 好点,所以每次导入的时间取决于函数的数量和(即在 seaborn 的情况下)在纯粹导入期间执行代码的可能性。至少,CPython 似乎不会为同一模块 (doc) 重新执行后续导入命令的代码 - 除非手动调用 importlib.reload(module)
    【解决方案3】:

    如果您想通过不导入两次来进行优化,请省去麻烦,因为 Python 已经解决了这个问题。

    如果你需要这个来避免NameErrors 或其他东西:修复你草率的编码 - 确保你不需要这个,即在你使用它之前定义(导入)所有东西(在导入时的情况:一次,在启动时,在模块级别)。

    如果您确实有充分的理由:sys.modules 是一个字典,其中包含已在某处导入的所有模块。但它只包含模块,并且由于from <module> import <variable> 的工作方式(照常导入整个模块,提取从中导入的内容),from sys import path 只会将sys 添加到sys.modules(如果不是' t 已在启动时导入)。 from pkg import module 添加了 pkg.module,正如您所料。

    【讨论】:

    • 谢谢,意思是不需要优化两次导入?如果我忘记了“import sys”,那么“reload(sys)”怎么样,这是否意味着我可以“import sys”;重新加载(sys)'而不损失性能?
    • @user: reload 明确规避 import 使用的缓存,如果源在导入后发生更改,则重新加载模块。您通常不需要它,除非在交互式提示中进行试验 - 即使在那里,后期绑定也可能会派上用场(例如,如果您定义 def f(): return os.listdir(os.getcwd()),您可以在之后 import os 并且将来调用该函数将起作用! )。
    • @user478514:“不需要对两次导入进行优化”。正确的。 Python 已经这样做了。请再次阅读教程。 import sys; reload(sys) 是一个愚蠢的例子。由于您的代码永远不会这样做,因此不要针对它进行优化。
    • 请注意,sys.modules 只包含模块的原始名称,而不是别名,例如:import networkx as nx; import sys; 'nx' in sys.modules 返回 False,而 import networkx as nx; import sys; 'networkx' in sys.modules 返回 True。
    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多