|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- """Filesystem utility functions."""
- from __future__ import absolute_import
- import os
- import errno
-
-
- def makedirs(path):
- """Create directory recursively if not exists.
- Similar to `makedir -p`, you can skip checking existence before this function.
- Parameters
- ----------
- path : str
- Path of the desired dir
- """
- try:
- os.makedirs(path)
- except OSError as exc:
- if exc.errno != errno.EEXIST:
- raise
-
-
- def try_import(package, message=None):
- """Try import specified package, with custom message support.
- Parameters
- ----------
- package : str
- The name of the targeting package.
- message : str, default is None
- If not None, this function will raise customized error message when import error is found.
- Returns
- -------
- module if found, raise ImportError otherwise
- """
- try:
- return __import__(package)
- except ImportError as e:
- if not message:
- raise e
- raise ImportError(message)
-
-
- def try_import_cv2():
- """Try import cv2 at runtime.
- Returns
- -------
- cv2 module if found. Raise ImportError otherwise
- """
- msg = "cv2 is required, you can install by package manager, e.g. 'apt-get', \
- or `pip install opencv-python --user` (note that this is unofficial PYPI package)."
- return try_import('cv2', msg)
-
-
- def import_try_install(package, extern_url=None):
- """Try import the specified package.
- If the package not installed, try use pip to install and import if success.
- Parameters
- ----------
- package : str
- The name of the package trying to import.
- extern_url : str or None, optional
- The external url if package is not hosted on PyPI.
- For example, you can install a package using:
- "pip install git+http://github.com/user/repo/tarball/master/egginfo=xxx".
- In this case, you can pass the url to the extern_url.
- Returns
- -------
- <class 'Module'>
- The imported python module.
- """
- try:
- return __import__(package)
- except ImportError:
- try:
- from pip import main as pipmain
- except ImportError:
- from pip._internal import main as pipmain
-
- # trying to install package
- url = package if extern_url is None else extern_url
- pipmain(['install', '--user', url]) # will raise SystemExit Error if fails
-
- # trying to load again
- try:
- return __import__(package)
- except ImportError:
- import sys
- import site
- user_site = site.getusersitepackages()
- if user_site not in sys.path:
- sys.path.append(user_site)
- return __import__(package)
- return __import__(package)
-
-
- """Import helper for pycocotools"""
-
-
- # NOTE: for developers
- # please do not import any pycocotools in __init__ because we are trying to lazy
- # import pycocotools to avoid install it for other users who may not use it.
- # only import when you actually use it
-
-
- def try_import_pycocotools():
- """Tricks to optionally install and import pycocotools"""
- # first we can try import pycocotools
- try:
- import pycocotools as _
- except ImportError:
- import os
- # we need to install pycootools, which is a bit tricky
- # pycocotools sdist requires Cython, numpy(already met)
- import_try_install('cython')
- # pypi pycocotools is not compatible with windows
- win_url = 'git+https://github.com/zhreshold/cocoapi.git#subdirectory=PythonAPI'
- try:
- if os.name == 'nt':
- import_try_install('pycocotools', win_url)
- else:
- import_try_install('pycocotools')
- except ImportError:
- faq = 'cocoapi FAQ'
- raise ImportError('Cannot import or install pycocotools, please refer to %s.' % faq)
|