Workaround python2.7 find_module limitation / explicitly close file (#20782)

Summary:
fix #20781 #20757
hmm I don't know an easy way to add a test to make sure it runs against a package installed as .egg. But i tested it locally with torchvision.
Pull Request resolved: https://github.com/pytorch/pytorch/pull/20782

Differential Revision: D15443600

Pulled By: ailzhang

fbshipit-source-id: 285eb0d9a44d6edb8e93618fa293f4feb431d2ae
This commit is contained in:
Ailing Zhang
2019-05-23 09:39:09 -07:00
committed by Facebook Github Bot
parent ec57d1f18a
commit a16708a1ae

View File

@ -159,12 +159,12 @@ def _get_cache_or_reload(github, force_reload):
url = _git_archive_link(repo_owner, repo_name, branch) url = _git_archive_link(repo_owner, repo_name, branch)
_download_archive_zip(url, cached_file) _download_archive_zip(url, cached_file)
cached_zipfile = zipfile.ZipFile(cached_file) with zipfile.ZipFile(cached_file) as cached_zipfile:
extraced_repo_name = cached_zipfile.infolist()[0].filename extraced_repo_name = cached_zipfile.infolist()[0].filename
extracted_repo = os.path.join(hub_dir, extraced_repo_name) extracted_repo = os.path.join(hub_dir, extraced_repo_name)
_remove_if_exists(extracted_repo) _remove_if_exists(extracted_repo)
# Unzip the code and rename the base folder # Unzip the code and rename the base folder
cached_zipfile.extractall(hub_dir) cached_zipfile.extractall(hub_dir)
_remove_if_exists(cached_file) _remove_if_exists(cached_file)
_remove_if_exists(repo_dir) _remove_if_exists(repo_dir)
@ -182,14 +182,35 @@ def _check_module_exists(name):
import importlib.find_loader import importlib.find_loader
return importlib.find_loader(name) is not None return importlib.find_loader(name) is not None
else: else:
# NB: imp doesn't handle hierarchical module names (names contains dots). # NB: Python2.7 imp.find_module() doesn't respect PEP 302,
# it cannot find a package installed as .egg(zip) file.
# Here we use workaround from:
# https://stackoverflow.com/questions/28962344/imp-find-module-which-supports-zipped-eggs?lq=1
# Also imp doesn't handle hierarchical module names (names contains dots).
try: try:
# 1. Try imp.find_module(), which searches sys.path, but does
# not respect PEP 302 import hooks.
import imp import imp
imp.find_module(name) result = imp.find_module(name)
except Exception: if result:
return False return True
return True except ImportError:
pass
path = sys.path
for item in path:
# 2. Scan path for import hooks. sys.path_importer_cache maps
# path items to optional "importer" objects, that implement
# find_module() etc. Note that path must be a subset of
# sys.path for this to work.
importer = sys.path_importer_cache.get(item)
if importer:
try:
result = importer.find_module(name, [item])
if result:
return True
except ImportError:
pass
return False
def _check_dependencies(m): def _check_dependencies(m):
dependencies = _load_attr_from_module(m, VAR_DEPENDENCY) dependencies = _load_attr_from_module(m, VAR_DEPENDENCY)