[python] 파이썬 모듈을 가져 왔는지 확인하는 방법은 무엇입니까?

코드의 어딘가에 모듈을 가져 왔는지 어떻게 확인합니까?

 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. 모듈 개체를 참조하는 현재 네임 스페이스 또는 모듈 네임 스페이스의 멤버 인 개체에 하나 이상의 이름을 바인딩합니다.

표현식 modulename not in sys.modules은 1 단계가 수행되었는지 테스트합니다. 2 단계의 결과를 테스트하려면 import서로 다른 개체를 참조하기 위해 서로 다른 이름을 설정하므로 사용 된 정확한 문을 알아야 합니다.

  • import modulename 세트 modulename = sys.modules['modulename']
  • import packagename.nestedmodule세트 packagename = sys.modules['packagename'](추가 수준에 관계없이)
  • import modulename as altname 세트 altname = sys.module['modulename']
  • import packagename.nestedmodule as altname 세트 altname = sys.modules['packagename.nestedmodule']
  • from somemodule import objectname 세트 objectname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename집합 nestedmodulename = sys.modules['packagename.nestedmodulename']( 이 가져 오기 전에 네임 스페이스에 명명 nestedmodulename된 개체가없는 경우에만 packagename중첩 된 모듈의 추가 이름이이 시점에서 상위 패키지 네임 스페이스에 추가됨)
  • from somemodule import objectname as altname 세트 altname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename as altname집합 altname = sys.modules['packagename.nestedmodulename']( 이 가져 오기 전에 네임 스페이스에 명명 nestedmodulename된 개체가없는 경우에만 packagename중첩 된 모듈의 추가 이름이이 시점에서 상위 패키지 네임 스페이스에 추가됨)

가져온 객체가 바인딩 된 이름이 주어진 네임 스페이스에 있는지 테스트 할 수 있습니다.

# 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!")


답변