簡體   English   中英

如何檢查python模塊是否已導入?

[英]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語句會做兩件事:

  1. 如果模塊之前從未導入過(== 不存在於sys.modules ),則將其加載並添加到sys.modules
  2. 將當前命名空間中的 1 個或多個名稱綁定到引用模塊對象或作為模塊命名空間成員的對象。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM