#!/usr/bin/env python
import os
import sys
import glob
import subprocess
import shlex
def runCommand(cmd, instream = None, msg = '', upon_succ=None):
if isinstance(cmd, str):
cmd = shlex.split(cmd)
try:
tc = subprocess.Popen(cmd, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE,
env={'PATH':os.pathsep.join(['.', os.environ['PATH']])})
if instream:
if sys.version_info.major == 3:
instream = instream.encode(sys.getdefaultencoding())
out, error = tc.communicate(instream)
else:
out, error = tc.communicate()
if sys.version_info.major == 3:
out = out.decode(sys.getdefaultencoding())
error = error.decode(sys.getdefaultencoding())
except Exception as e:
raise OSError ("Execution of command '{0}' failed: {1}".format(cmd, e))
# everything is OK
if upon_succ:
# call the function (upon_succ) using others as parameters.
upon_succ[0](*(upon_succ[1:]))
return out, error
def loadPackages(fn):
with open(fn, 'r') as f:
p = [x.strip() for x in f.readlines() if not x.startswith("#")]
return p
if __name__ == "__main__":
if len(sys.argv) != 3:
sys.exit("Usage: {0} PackageList TargetDirectory".format(sys.argv[0]))
lib_dir = sys.argv[2]
if not os.path.exists(os.path.expanduser(lib_dir)):
sys.exit("Cannot find directory {0}".format(lib_dir))
packages = loadPackages(sys.argv[1])
cmd = "R --slave --vanilla"
for package in packages:
print("Installing {0} to {1}".format(package, lib_dir))
rscript = '''install.packages("{0}", lib="{1}", repos="http://cran.stat.ucla.edu")'''.\
format(package, lib_dir)
out, error = runCommand(cmd, rscript)
print(out)
print(error)