코드의 어딘가에 모듈을 가져 왔는지 어떻게 확인합니까?
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
은 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!")