Get command line arguments as string
The command line arguments are already handled by the shell before they are sent into sys.argv
. Therefore, shell quoting and whitespace are gone and cannot be exactly reconstructed.
Assuming the user double-quotes strings with spaces, here's a python program to reconstruct the command string with those quotes.
commandstring = '';
for arg in sys.argv[1:]: # skip sys.argv[0] since the question didn't ask for it
if ' ' in arg:
commandstring+= '"{}" '.format(arg) ; # Put the quotes back in
else:
commandstring+="{} ".format(arg) ; # Assume no space => no quotes
print(commandstring);
For example, the command line
./saferm.py sdkf lsadkf -r sdf -f sdf -fs -s "flksjfksdkfj sdfsdaflkasdf"
will produce the same arguments as output:
sdkf lsadkf -r sdf -f sdf -fs -s "flksjfksdkfj sdfsdaflkasdf"
since the user indeed double-quoted only arguments with strings.
An option:
import sys
' '.join(sys.argv[1:])
The join()
function joins its arguments by whatever string you call it on. So ' '.join(...)
joins the arguments with single spaces (' '
) between them.
None of the previous answers properly escape all possible arguments, like empty args or those containing quotes. The closest you can get with minimal code is to use shlex.quote (available since Python 3.3):
import shlex
cmdline = " ".join(map(shlex.quote, sys.argv[1:]))
EDIT
Here is a Python 2+3 compatible solution:
import sys
try:
from shlex import quote as cmd_quote
except ImportError:
from pipes import quote as cmd_quote
cmdline = " ".join(map(cmd_quote, sys.argv[1:]))