line to argv transformation

Tim Chase python.list at tim.thechases.com
Mon Jun 16 08:44:20 EDT 2014


On 2014年06月16日 13:51, Antoon Pardon wrote:
> >>> shlex.split("ls *.py") 
> ['ls', '*.py']
> >>> shlex.split("ls '*.py'") 
> ['ls', '*.py']

To accommodate this, I'd probably just clone the shlib.py to my local
project under a new name and then tweak the source to emit whether a
token was quoted or not, something like the diff below.
You can then iterate over your string/token-stream and know whether
it was quoted or not, allowing you to do any post-processing/globbing
on that file.
-tkc
--- /usr/lib/python2.7/shlex.py	2014年03月13日 05:54:53.000000000 -0500
+++ /home/tim/tmp/myshlex.py	2014年06月16日 07:39:34.130645270 -0500
@@ -93,29 +93,30 @@
 print "shlex: popping token " + repr(tok)
 return tok
 # No pushback. Get a token.
- raw = self.read_token()
+ was_quoted, raw = self.read_token()
 # Handle inclusions
 if self.source is not None:
 while raw == self.source:
- spec = self.sourcehook(self.read_token())
+ was_quoted, token = self.read_token()
+ spec = self.sourcehook(roken)
 if spec:
 (newfile, newstream) = spec
 self.push_source(newstream, newfile)
- raw = self.get_token()
+ was_quoted, raw = self.get_token()
 # Maybe we got EOF instead?
 while raw == self.eof:
 if not self.filestack:
 return self.eof
 else:
 self.pop_source()
- raw = self.get_token()
+ was_quoted, raw = self.get_token()
 # Neither inclusion nor EOF
 if self.debug >= 1:
 if raw != self.eof:
 print "shlex: token=" + repr(raw)
 else:
 print "shlex: token=EOF"
- return raw
+ return was_quoted, raw
 
 def read_token(self):
 quoted = False
@@ -243,7 +244,7 @@
 print "shlex: raw token=" + repr(result)
 else:
 print "shlex: raw token=EOF"
- return result
+ return quoted, result
 
 def sourcehook(self, newfile):
 "Hook called on a filename to be sourced."
@@ -266,10 +267,10 @@
 return self
 
 def next(self):
- token = self.get_token()
+ was_quoted, token = self.get_token()
 if token == self.eof:
 raise StopIteration
- return token
+ return was_quoted, token
 
 def split(s, comments=False, posix=True):
 lex = shlex(s, posix=posix)
@@ -285,7 +286,7 @@
 file = sys.argv[1]
 lexer = shlex(open(file), file)
 while 1:
- tt = lexer.get_token()
+ was_quoted, tt = lexer.get_token()
 if tt:
 print "Token: " + repr(tt)
 else:


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /