[英]How to check if a python module has been imported?
如何檢查我是否在代碼中的某處導入了模塊?
if not has_imported("somemodule"):
print('you have not imported somemodule')
我想檢查是否已經導入了一個模塊的原因是因為我有一個不想導入的模塊,因為有時它會弄亂我的程序。
在sys.modules
字典中測試模塊名稱:
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
從文檔中:
這是一個將模塊名稱映射到已加載模塊的字典。
請注意, import
語句會做兩件事:
sys.modules
),則將其加載並添加到sys.modules
。 modulename not in sys.modules
的表達式modulename not in sys.modules
測試步驟 1 是否已經發生。 測試第 2 步的結果需要知道使用了什么確切的import
語句,因為它們設置了不同的名稱來引用不同的對象:
import modulename
設置modulename = sys.modules['modulename']
import packagename.nestedmodule
sets packagename = sys.modules['packagename']
(不管你添加了多少附加級別)import modulename as altname
設置altname = sys.module['modulename']
import packagename.nestedmodule as altname
set altname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
設置objectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
sets nestedmodulename = sys.modules['packagename.nestedmodulename']
(僅當在此導入之前packagename
命名空間中沒有名為nestedmodulename
對象時,嵌套模塊的附加名稱會添加到父包命名空間中)觀點)from somemodule import objectname as altname
sets altname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
sets altname = sys.modules['packagename.nestedmodulename']
(僅當在此導入之前packagename
命名空間中沒有名為nestedmodulename
對象時,嵌套模塊的附加名稱被添加到父包命名空間這一點)您可以測試導入對象綁定的名稱是否存在於給定的命名空間中:
# is this name visible in the current scope:
'importedname' in dir()
# or, is this a name in the globals of the current module:
'importedname' in globals()
# or, does the name exist in the namespace of another module:
'importedname' in globals(sys.modules['somemodule'])
這只會告訴您名稱存在(已綁定),而不是它是否引用特定模塊或來自該模塊的對象。 您可以進一步內省該對象或測試它是否與sys.modules
可用的對象相同,如果您需要排除該名稱從那時起已完全設置為其他內容。
對於接受的 sys.modules 答案,我會添加一個警告,以注意在導入時重命名模塊:
>>> import sys
>>> import datetime as dt
>>> 'dt' in sys.modules
False
>>> 'datetime' in sys.modules
True
使用 sys.modules 測試模塊是否已導入(我以 unicodedata 為例):
>>> import sys
>>> 'unicodedata' in sys.modules
False
>>> import unicodedata
>>> 'unicodedata' in sys.modules
True
sys.modules
包含解釋器當前實例中任何地方使用的所有模塊,因此如果在任何其他 Python 模塊中導入,則會顯示。
dir()
檢查名稱是否在當前命名空間中定義。
2 的組合比單獨的更安全,只要您沒有自己定義copy
。
if ('copy' in sys.modules) and ('copy' in dir()):
if "sys" not in dir():
print("sys not imported!")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.