Source code for sourced.ml.core.utils.bigartm
import glob
import logging
import multiprocessing
import os
import shutil
import subprocess
import tempfile
[docs]def execute(cmd, cwd, log):
log.info(">>> %s", cmd)
parsed = [v for v in cmd.split(" ") if v]
subprocess.check_call(parsed, cwd=cwd)
[docs]def install_bigartm(args=None, target="./bigartm", tempdir=None):
"""
Deploys bigartm/bigartm at the specified path.
:param args: :class:`argparse.Namespace` with "output" and "tmpdir". \
"output" sets the target directory, "tmpdir" sets \
the temporary directory which is used to clone bigartm/bigartm \
and build it.
:param target: The path to the built executable. If args is not None, it \
becomes overridden.
:param tempdir: The temporary directory where to clone and build \
bigartm/bigartm. If args is not None, it becomes overridden.
:return: None if successful; otherwise, the error code (can be 0!).
"""
log = logging.getLogger("bigartm")
if args is not None:
tempdir = args.tmpdir
target = os.path.join(args.output, "bigartm")
if shutil.which(os.path.basename(target)) or shutil.which(target, path=os.getcwd()):
log.warning("bigartm is in the PATH, no-op.")
return 0
if not shutil.which("cmake"):
log.error("You need to install cmake.")
return 1
parent_dir = os.path.dirname(target)
os.makedirs(parent_dir, exist_ok=True)
if not os.path.isdir(parent_dir):
log.error("%s is not a directory.", parent_dir)
return 2
with tempfile.TemporaryDirectory(prefix="bigartm-", dir=tempdir) as tmpdir:
log.info("Building bigartm/bigartm in %s...", tmpdir)
execute("git clone --single-branch --depth=1 https://github.com/bigartm/bigartm .",
tmpdir, log)
cwd = os.path.join(tmpdir, "build")
os.mkdir(cwd)
execute("cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DPYTHON=python3 ..",
cwd, log)
execute("make -j%d" % multiprocessing.cpu_count(), cwd, log)
whl_path = glob.glob(os.path.join(tmpdir, "build/python/*.whl"))[0]
execute("pip3 install \"%s\"" % whl_path, cwd, log)
shutil.copyfile(os.path.join(cwd, "bin", "bigartm"), target)
os.chmod(target, 0o777)
log.info("Installed %s", os.path.abspath(target))