From 648e5789fc3249701c865ee00e15db767a386790 Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Fri, 22 Jul 2016 14:28:00 -0700 Subject: [PATCH] Enable runcmd to use a list for the command, and have it quote elements as needed. --- build.py | 19 +++++++++++-------- buildtools/config.py | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/build.py b/build.py index 04e35317..7e86fcb9 100755 --- a/build.py +++ b/build.py @@ -231,16 +231,17 @@ def setPythonVersion(args): else: PYTHON = args[idx+1] del args[idx:idx+2] - PYVER = runcmd('"%s" -c "import sys; print(sys.version[:3])"' % PYTHON, - getOutput=True, echoCmd=False) + PYVER = runcmd([PYTHON, '-c', 'import sys; print(sys.version[:3])'], + getOutput=True, echoCmd=True) + msg("PYVER: {!r}".format(PYVER)) PYSHORTVER = PYVER[0] + PYVER[2] break if havePyVer: if isWindows and os.environ.get('TOOLS'): - # Use $TOOLS to find the correct Python. It should be the install - # root of all Python's on the system, with the 64-bit ones in an - # amd64 subfolder, like this: + # Use $TOOLS to find the correct Python. If set then it should be + # the install root of all Python's on the system, with the 64-bit + # ones in an amd64 subfolder, like this: # # $TOOLS\Python27\python.exe # $TOOLS\Python33\python.exe @@ -284,9 +285,11 @@ def setPythonVersion(args): PYTHON = os.path.abspath(PYTHON) msg('Build using: "%s"' % PYTHON) - msg(runcmd('"%s" -c "import sys; print(sys.version)"' % PYTHON, True, False)) - PYTHON_ARCH = runcmd('"%s" -c "import platform; print(platform.architecture()[0])"' - % PYTHON, True, False) + msg(runcmd([PYTHON, '-c', 'import sys; print(sys.version)'], True, False)) + PYTHON_ARCH = runcmd( + [PYTHON, '-c', 'import platform; print(platform.architecture()[0])'], + True, False) + msg('Python\'s architecture is %s' % PYTHON_ARCH) os.environ['PYTHON'] = PYTHON diff --git a/buildtools/config.py b/buildtools/config.py index 4a1cd0c3..5df36dcb 100644 --- a/buildtools/config.py +++ b/buildtools/config.py @@ -781,6 +781,24 @@ def getVcsRev(): def runcmd(cmd, getOutput=False, echoCmd=True, fatal=True): + """ + Runs a give command-line command, optionally returning the output. + """ + if isinstance(cmd, list): + # add quotes to elements of the command that need it + cmd = cmd[:] + for idx, item in enumerate(cmd): + if ' ' in item or ';' in item: + if item[0] not in ['"', "'"]: + if '"' in item: + item = item.replace('"', '\\"') + item = '"{}"'.format(item) + cmd[idx] = item + + cmd = ' '.join(cmd) + #if echoCmd: + # msg(' '.join(cmd)) + if echoCmd: msg(cmd)