Call conda more resiliently

This commit is contained in:
yuvipanda
2018-06-26 18:35:58 -07:00
parent 95a2f1987a
commit 303d2d0e88
2 changed files with 66 additions and 3 deletions

View File

@@ -4,6 +4,10 @@ Wrap conda commandline program
import os import os
import subprocess import subprocess
import json import json
import sys
# Use sys.executable to call conda to avoid needing to fudge PATH
CONDA_EXECUTABLE = [sys.executable, '-m', 'conda']
def ensure_conda_env(prefix): def ensure_conda_env(prefix):
@@ -13,7 +17,7 @@ def ensure_conda_env(prefix):
abspath = os.path.abspath(prefix) abspath = os.path.abspath(prefix)
try: try:
output = json.loads( output = json.loads(
subprocess.check_output(['conda', 'create', '--json', '--prefix', abspath]).decode() subprocess.check_output(CONDA_EXECUTABLE + ['create', '--json', '--prefix', abspath]).decode()
) )
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
output = json.loads(e.output.decode()) output = json.loads(e.output.decode())
@@ -31,8 +35,8 @@ def ensure_conda_packages(prefix, packages):
abspath = os.path.abspath(prefix) abspath = os.path.abspath(prefix)
# Let subprocess errors propagate # Let subprocess errors propagate
# FIXME: raise different exception when using # FIXME: raise different exception when using
raw_output = subprocess.check_output([ raw_output = subprocess.check_output(CONDA_EXECUTABLE + [
'conda', 'install', 'install',
'--json', '--json',
'--prefix', abspath '--prefix', abspath
] + packages).decode() ] + packages).decode()

59
tljh/systemd.py Normal file
View File

@@ -0,0 +1,59 @@
"""
Wraps systemctl to install, uninstall, start & stop systemd services.
We use sudo + subprocess calls for everything. This works when we
are running as root & as normal user (with arbitrary sudo privileges).
Arbitrary sudo privileges suck, but are better than running the whole
process as root.
If we use a debian package instead, we can get rid of all this code.
"""
import subprocess
import os
def reload_daemon():
"""
Equivalent to systemctl daemon-reload.
Makes systemd discover new units.
"""
subprocess.run([
'sudo',
'systemctl',
'daemon-reload'
], check=True)
def install_unit(name, unit, path='/etc/systemd/system'):
"""
Install unit wih given name
"""
subprocess.run([
'sudo',
'tee',
os.path.join(path, name)
], input=unit.encode('utf-8'), check=True)
def uninstall_unit(name, path='/etc/systemd/system'):
"""
Uninstall unit with given name
"""
subprocess.run([
'sudo',
'rm',
os.path.join(path, name)
], check=True)
def start_service(name):
"""
Start service with given name.
"""
subprocess.run([
'sudo',
'systemctl',
'start',
name
], check=True)