如何测试是否导入了一个python模块?
如何测试模块是否已在python中导入 例如,我需要基本知识:如何测试是否导入了一个python模块?,python,testing,module,import,Python,Testing,Module,Import,如何测试模块是否已在python中导入 例如,我需要基本知识: if not has_imported("sys"): import sys 也 谢谢 Rgs 感谢您的所有评论: 代码已粘贴在这里。 如果您不想通过两次导入来进行优化,那么就省去了麻烦,因为Python已经解决了这个问题 如果您需要这一点来避免名称错误或其他问题:修复您草率的编码-确保您不需要这一点,即在使用之前定义(导入)所有内容(如果导入:一次,在启动时,在模块级) 如果您确实有一个很好的理由:sys.modules是
if not has_imported("sys"):
import sys
也
谢谢
Rgs
感谢您的所有评论:
代码已粘贴在这里。
如果您不想通过两次导入来进行优化,那么就省去了麻烦,因为Python已经解决了这个问题 如果您需要这一点来避免
名称错误
或其他问题:修复您草率的编码-确保您不需要这一点,即在使用之前定义(导入)所有内容(如果导入:一次,在启动时,在模块级)
如果您确实有一个很好的理由:
sys.modules
是一个包含已导入的所有模块的字典。但是它只包含模块,并且由于导入的工作方式(像往常一样导入整个模块,从中提取导入的内容),从sys导入路径导入的只会将sys
添加到sys.modules
(如果启动时尚未导入)<代码>从pkg导入模块添加pkg.module
,正如您可能期望的那样。我觉得被接受的答案并不完全正确
Python在多次导入同一模块时仍有开销。Python处理它时不会给您错误,当然,但这并不意味着它不会减慢脚本的速度。正如您将从下面的URL中看到的,在多次导入模块时,会产生显著的开销
例如,在除特定条件外可能不需要特定模块的情况下,如果该模块较大或开销较高,则有理由仅在条件下导入。这也并不意味着你是一个草率的程序员
这是我在运行时更改代码的解决方案 谢谢,这意味着不需要对两次导入进行优化?如果我忘记了“导入系统”,那么“重新加载(系统)”是不是意味着我可以“导入系统”;重新加载(sys)‘不丢失性能?@user:reload
显式规避了import
用于重新加载模块(如果自导入模块后源已更改)的缓存。除非在交互式提示中进行实验,否则通常不需要它-即使在那里,后期绑定也可能会起到解救作用(例如,如果您定义def():return os.listdir(os.getcwd())
,您可以导入操作系统
,以后对该函数的调用也会起作用!)@user478514:“不需要为两次导入进行优化”。正确。Python已经这样做了。请再次阅读教程。import sys;reload(sys)
是一个愚蠢的例子。因为您的代码永远不会这样做,所以不要对其进行优化。请注意,sys.modules只包含模块的原始名称,而不是别名,例如:import networkx as nx;import sys;sys.modules中的“nx”返回False
,而import networkx as nx;import sys;'networkx'在sy中s、 模块
返回True。我无法想象在任何情况下,您都必须担心在模块上重新加载的性能。首先是因为无论您执行什么操作,它们都很慢,其次是因为如果您需要频繁地重新加载模块,以致模块出现性能问题,那么您的操作是非常错误的。我敢打赌,您是错的在错误的树上,您试图以完全错误的方式解决问题。请始终解释为什么您觉得需要解决您想要解决的问题。这有助于您获得正确的答案。谢谢,代码已粘贴在此处:使用CPython v3.5.1,每次调用的开销仅为~3ns。使用%时间进行测试它“'import json;json.dumps(data)”
和import json;%timeit“'json.dumps(data)”
带有data=['foo',{'bar':('baz',None,1.0,2)]
。是的,这是有道理的。但是您正在加载的特定模块也会在这段时间内产生影响。因为当您导入模块时,代码会立即运行-诸如def
和class
等关键字会被主动加载并运行。这就是为什么如果u name\uuu==“\ uu主__“:
bit,因此除非直接调用该代码,否则该代码不会运行。因此,老实说,我不确定对模块的后续调用是否仍然运行代码…好的一点,因此每次导入的时间取决于函数的数量和(即seaborn)在完全导入期间执行代码的可能性。至少,似乎CPython不会为同一模块()的后续导入命令重新执行代码,除非手动调用。
if not has_imported("sys.path"):
from sys import path
from sys import modules
try:
module = modules[module_name]
except KeyError:
__import__('m')