Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何测试是否导入了一个python模块?_Python_Testing_Module_Import - Fatal编程技术网

如何测试是否导入了一个python模块?

如何测试是否导入了一个python模块?,python,testing,module,import,Python,Testing,Module,Import,如何测试模块是否已在python中导入 例如,我需要基本知识: if not has_imported("sys"): import sys 也 谢谢 Rgs 感谢您的所有评论: 代码已粘贴在这里。 如果您不想通过两次导入来进行优化,那么就省去了麻烦,因为Python已经解决了这个问题 如果您需要这一点来避免名称错误或其他问题:修复您草率的编码-确保您不需要这一点,即在使用之前定义(导入)所有内容(如果导入:一次,在启动时,在模块级) 如果您确实有一个很好的理由:sys.modules是

如何测试模块是否已在python中导入

例如,我需要基本知识:

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')