I want to find out from inside the script -- the exact command I used to fire it up. I tried the following:
#!/usr/bin/env python
import sys, os
print os.path.basename(sys.argv[0]), sys.argv[1:]
But it loses info:
$ 1.py -1 dfd 'gf g' "df df"
1.py ['-1', 'dfd', 'gf g', 'df df']
You see -- it has already lost the info as to wither I've used double quotes, single quotes or there have been no quotes at all -- in the command.
Edit:
Here's what I'm using. All args in my script have default values, and after args are parsed with argparse
:
args = parser.parse_args()
I log them or if there's a log -- overwrite them:
logName = "." + (os.path.splitext(os.path.basename(sys.argv[0])))[0] + ".json"
if os.path.exists(logName):
print "!!! I've found log", logName
Args = bk_loads_json(logName)
for arg in Args:
exec('args.{0} = Args["{0}"]'.format(arg))
else:
print "!!! the log of args is saved to", logName
bk_saves_json(args.__dict__, logName)
defuns mentioned:
def bk_saves_json(myCustomDct, flNm):
"Takes dict, and writes it to the file."
FlNm = open(flNm, 'w')
tmpJsn = json.dumps(myCustomDct, sort_keys=True, indent=4)
FlNm.write(tmpJsn)
FlNm.close()
def bk_loads_json(flNm):
"Takes file of the json and returns it as a dict."
json_data=open(flNm)
data = json.load(json_data)
json_data.close()
return data
The command line interface (also known as CLI) is a means to interact with a command line script. Python comes with several different libraries that allow you to write a command line interface for your scripts, but the standard way for creating a CLI in Python is currently the Python argparse library.
A widely used way to run Python code is through an interactive session. To start a Python interactive session, just open a command-line or terminal and then type in python , or python3 depending on your Python installation, and then hit Enter .
If you need to execute a shell command with Python, there are two ways. You can either use the subprocess module or the RunShellCommand() function. The first option is easier to run one line of code and then exit, but it isn't as flexible when using arguments or producing text output.
The information you're looking for (command params including quotes) is not available.
The shell (bash), not python, reads and interprets quotes--by the time python or any other spawned program sees the parameters, the quotes are removed. (Except for quoted quotes, of course.)
When you type a command into the shell, you use quotes to tell the shell which tokens on your command line to treat as a single parameter. Whitespace is used to break up your command line into individual params, and quotes are used to override that--to include whitespace within a parameter instead of to separate parameters.
The shell then forks the executable and passes to it your list of parameters. Any unquoted quotes have already been "used up" by the shell in its parsing of your command line, so they effectively no longer exist at this stage, and your command (python) doesn't see them.
By the way, I have to wonder why you care about getting the quotes. I have to say that at first glance it seems misguided. Perhaps we can help if you tell us why you feel you need them?
In respose to OP's comment below, here's a way to output the original command line--or at least one that's functionally equivalent:
import pipes # or shlex if python3
print sys.argv[0], ' '.join( [pipes.quote(s) for s in sys.argv[1:]] )
It just adds quotes around all params.
I would suggest using:
import subprocess, sys
print subprocess.list2cmdline(sys.argv[1:])
The list2cmdline
is used to transform a list of arguments into a single string usable from the shell. From the doc:
Translate a sequence of arguments into a command line string, using the same rules as the MS C runtime:
1) Arguments are delimited by white space, which is either a space or a tab.
2) A string surrounded by double quotation marks is interpreted as a single argument, regardless of white space contained within. A quoted string can be embedded in an argument.
3) A double quotation mark preceded by a backslash is interpreted as a literal double quotation mark.
4) Backslashes are interpreted literally, unless they immediately precede a double quotation mark.
5) If backslashes immediately precede a double quotation mark, every pair of backslashes is interpreted as a literal backslash. If the number of backslashes is odd, the last backslash escapes the next double quotation mark as described in rule 3.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With