#!/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)