108 lines
3.2 KiB
Python
108 lines
3.2 KiB
Python
"""Python related tools."""
|
|
|
|
import os
|
|
import sys
|
|
|
|
from . import package
|
|
from . import utils
|
|
|
|
|
|
def get_path(cmd, venv=None):
|
|
"""Return path to cmd."""
|
|
path = cmd
|
|
if venv:
|
|
path = os.path.join(venv, "bin", path)
|
|
return path
|
|
|
|
|
|
def get_pip_path(venv):
|
|
"""Return the full path to pip command."""
|
|
binpath = "pip"
|
|
if venv:
|
|
binpath = os.path.join(venv, "bin", binpath)
|
|
return binpath
|
|
|
|
|
|
def install_package(name, venv=None, upgrade=False, binary=True, **kwargs):
|
|
"""Install a Python package using pip."""
|
|
cmd = "{} install{}{}{} {}".format(
|
|
get_pip_path(venv),
|
|
" -U" if upgrade else "",
|
|
" --no-binary :all:" if not binary else "",
|
|
" --pre" if kwargs.pop("beta", False) else "",
|
|
name
|
|
)
|
|
utils.exec_cmd(cmd, **kwargs)
|
|
|
|
|
|
def install_packages(names, venv=None, upgrade=False, **kwargs):
|
|
"""Install a Python package using pip."""
|
|
cmd = "{} install{}{} {}".format(
|
|
get_pip_path(venv),
|
|
" -U " if upgrade else "",
|
|
" --pre" if kwargs.pop("beta", False) else "",
|
|
" ".join(names)
|
|
)
|
|
utils.exec_cmd(cmd, **kwargs)
|
|
|
|
|
|
def get_package_version(name, venv=None, **kwargs):
|
|
"""Returns the version of an installed package."""
|
|
cmd = "{} show {}".format(
|
|
get_pip_path(venv),
|
|
name
|
|
)
|
|
exit_code, output = utils.exec_cmd(cmd, **kwargs)
|
|
if exit_code != 0:
|
|
utils.error(f"Failed to get version of {name}. "
|
|
f"Output is: {output}")
|
|
sys.exit(1)
|
|
|
|
output_list = output.decode().split("\n")
|
|
version_item_list = output_list[1].split(":")
|
|
version_list = version_item_list[1].split(".")
|
|
version_list_clean = []
|
|
for element in version_list:
|
|
try:
|
|
version_list_clean.append(int(version_list[i]))
|
|
except ValueError:
|
|
utils.printcolor(
|
|
f"Failed to decode some part of the version of {name}",
|
|
utils.YELLOW)
|
|
version_list_clean.append(element)
|
|
return version_list_clean
|
|
|
|
|
|
def install_package_from_repository(name, url, vcs="git", venv=None, **kwargs):
|
|
"""Install a Python package from its repository."""
|
|
if vcs == "git":
|
|
package.backend.install("git")
|
|
cmd = "{} install -e {}+{}#egg={}".format(
|
|
get_pip_path(venv), vcs, url, name)
|
|
utils.exec_cmd(cmd, **kwargs)
|
|
|
|
|
|
def setup_virtualenv(path, sudo_user=None, python_version=2):
|
|
"""Install a virtualenv if needed."""
|
|
if os.path.exists(path):
|
|
return
|
|
if python_version == 2:
|
|
python_binary = "python"
|
|
packages = ["python-virtualenv"]
|
|
if utils.dist_name() == "debian":
|
|
packages.append("virtualenv")
|
|
else:
|
|
if utils.dist_name().startswith("centos"):
|
|
python_binary = "python3"
|
|
packages = ["python3"]
|
|
else:
|
|
python_binary = "python3"
|
|
packages = ["python3-venv"]
|
|
package.backend.install_many(packages)
|
|
with utils.settings(sudo_user=sudo_user):
|
|
if python_version == 2:
|
|
utils.exec_cmd("virtualenv {}".format(path))
|
|
else:
|
|
utils.exec_cmd("{} -m venv {}".format(python_binary, path))
|
|
install_packages(["pip", "setuptools\<58.0.0"], venv=path, upgrade=True)
|