Ответ 1
Ничего, если модуль уже импортирован, он не загружается снова.
Вы просто получите ссылку на модуль, который уже был импортирован (он будет получен от sys.modules
).
Чтобы получить список уже импортированных модулей, вы можете найти sys.modules.keys()
(обратите внимание, что urllib
здесь импортирует много других модулей):
>>> import sys
>>> print len(sys.modules.keys())
44
>>> print sys.modules.keys()
['copy_reg', 'sre_compile', '_sre', 'encodings', 'site', '__builtin__', 'sysconfig', '__main__', 'encodings.encodings', 'abc', 'posixpath', '_weakrefset', 'errno', 'encodings.codecs', 'sre_constants', 're', '_abcoll', 'types', '_codecs', 'encodings.__builtin__', '_warnings', 'genericpath', 'stat', 'zipimport', '_sysconfigdata', 'warnings', 'UserDict', 'encodings.utf_8', 'sys', 'virtualenvwrapper', '_osx_support', 'codecs', 'readline', 'os.path', 'sitecustomize', 'signal', 'traceback', 'linecache', 'posix', 'encodings.aliases', 'exceptions', 'sre_parse', 'os', '_weakref']
>>> import urllib
>>> print len(sys.modules.keys())
70
>>> print sys.modules.keys()
['cStringIO', 'heapq', 'base64', 'copy_reg', 'sre_compile', '_collections', '_sre', 'functools', 'encodings', 'site', '__builtin__', 'sysconfig', 'thread', '_ssl', '__main__', 'operator', 'encodings.encodings', '_heapq', 'abc', 'posixpath', '_weakrefset', 'errno', '_socket', 'binascii', 'encodings.codecs', 'urllib', 'sre_constants', 're', '_abcoll', 'collections', 'types', '_codecs', 'encodings.__builtin__', '_struct', '_warnings', '_scproxy', 'genericpath', 'stat', 'zipimport', '_sysconfigdata', 'string', 'warnings', 'UserDict', 'struct', 'encodings.utf_8', 'textwrap', 'sys', 'ssl', 'virtualenvwrapper', '_osx_support', 'codecs', 'readline', 'os.path', 'strop', '_functools', 'sitecustomize', 'socket', 'keyword', 'signal', 'traceback', 'urlparse', 'linecache', 'itertools', 'posix', 'encodings.aliases', 'time', 'exceptions', 'sre_parse', 'os', '_weakref']
>>> import urllib #again!
>>> print len(sys.modules.keys()) #has not loaded any additional modules
70
Дайте ему вихрь:
import sys
>>> sys.modules["foo"] = "bar" # Let pretend we imported a module named "foo", which is a string.
>>> print __import__("foo")
bar # Not a module, that my string!
Как вы можете видеть, если модуль найден не sys.modules
, вы просто получите новую ссылку на него. Что это.
Обратите внимание, что это означает, что модули должны быть сконструированы так, чтобы не иметь побочных эффектов (например, печатных материалов), когда они импортированы.
Перезагрузка модулей за пределами интерактивного сеанса обычно не является очень хорошей практикой (хотя в ней есть свои варианты использования). В других ответах подробно рассказывается, как вы это сделаете.