|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import os.path as osp |
|
|
import subprocess |
|
|
|
|
|
|
|
|
def is_installed(package: str) -> bool: |
|
|
"""Check package whether installed. |
|
|
|
|
|
Args: |
|
|
package (str): Name of package to be checked. |
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
import importlib.util |
|
|
|
|
|
import pkg_resources |
|
|
from pkg_resources import get_distribution |
|
|
|
|
|
|
|
|
|
|
|
importlib.reload(pkg_resources) |
|
|
try: |
|
|
get_distribution(package) |
|
|
return True |
|
|
except pkg_resources.DistributionNotFound: |
|
|
spec = importlib.util.find_spec(package) |
|
|
if spec is None: |
|
|
return False |
|
|
elif spec.origin is not None: |
|
|
return True |
|
|
else: |
|
|
return False |
|
|
|
|
|
|
|
|
def get_installed_path(package: str) -> str: |
|
|
"""Get installed path of package. |
|
|
|
|
|
Args: |
|
|
package (str): Name of package. |
|
|
|
|
|
Example: |
|
|
>>> get_installed_path('mmcls') |
|
|
>>> '.../lib/python3.7/site-packages/mmcls' |
|
|
""" |
|
|
import importlib.util |
|
|
|
|
|
from pkg_resources import DistributionNotFound, get_distribution |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
pkg = get_distribution(package) |
|
|
except DistributionNotFound as e: |
|
|
|
|
|
|
|
|
spec = importlib.util.find_spec(package) |
|
|
if spec is not None: |
|
|
if spec.origin is not None: |
|
|
return osp.dirname(spec.origin) |
|
|
else: |
|
|
|
|
|
|
|
|
raise RuntimeError( |
|
|
f'{package} is a namespace package, which is invalid ' |
|
|
'for `get_install_path`') |
|
|
else: |
|
|
raise e |
|
|
|
|
|
possible_path = osp.join(pkg.location, package) |
|
|
if osp.exists(possible_path): |
|
|
return possible_path |
|
|
else: |
|
|
return osp.join(pkg.location, package2module(package)) |
|
|
|
|
|
|
|
|
def package2module(package: str): |
|
|
"""Infer module name from package. |
|
|
|
|
|
Args: |
|
|
package (str): Package to infer module name. |
|
|
""" |
|
|
from pkg_resources import get_distribution |
|
|
pkg = get_distribution(package) |
|
|
if pkg.has_metadata('top_level.txt'): |
|
|
module_name = pkg.get_metadata('top_level.txt').split('\n')[0] |
|
|
return module_name |
|
|
else: |
|
|
raise ValueError(f'can not infer the module name of {package}') |
|
|
|
|
|
|
|
|
def call_command(cmd: list) -> None: |
|
|
try: |
|
|
subprocess.check_call(cmd) |
|
|
except Exception as e: |
|
|
raise e |
|
|
|
|
|
|
|
|
def install_package(package: str): |
|
|
if not is_installed(package): |
|
|
call_command(['python', '-m', 'pip', 'install', package]) |
|
|
|