Permalink
Browse files

Create fallback with old arg_split, incase CommandLineToArgvW is miss…

…ing.
  • Loading branch information...
Jörgen Stenarson
Jörgen Stenarson committed Nov 30, 2011
1 parent bf44a93 commit 2381b094f9aab8b5dc925b3edb6b779c70431a3e
Showing with 48 additions and 23 deletions.
  1. +48 −23 IPython/utils/_process_win32.py
@@ -151,26 +151,51 @@ def getoutput(cmd):
out = ''
return out
-
-CommandLineToArgvW = ctypes.windll.shell32.CommandLineToArgvW
-CommandLineToArgvW.arg_types = [LPCWSTR, POINTER(c_int)]
-CommandLineToArgvW.res_types = [POINTER(LPCWSTR)]
-LocalFree = ctypes.windll.kernel32.LocalFree
-LocalFree.res_type = HLOCAL
-LocalFree.arg_types = [HLOCAL]
-
-def arg_split(commandline, posix=False):
- """Split a command line's arguments in a shell-like manner.
-
- This is a special version for windows that use a ctypes call to CommandLineToArgvW
- to do the argv splitting. The posix paramter is ignored.
- """
- #CommandLineToArgvW returns path to executable if called with empty string.
- if commandline.strip() == "":
- return []
- argvn = c_int()
- result_pointer = CommandLineToArgvW(py3compat.cast_unicode(commandline.lstrip()), ctypes.byref(argvn))
- result_array_type = LPCWSTR * argvn.value
- result = [arg for arg in result_array_type.from_address(result_pointer)]
- retval = LocalFree(result_pointer)
- return result
+try:
+ CommandLineToArgvW = ctypes.windll.shell32.CommandLineToArgvW
+ CommandLineToArgvW.arg_types = [LPCWSTR, POINTER(c_int)]
+ CommandLineToArgvW.res_types = [POINTER(LPCWSTR)]
+ LocalFree = ctypes.windll.kernel32.LocalFree
+ LocalFree.res_type = HLOCAL
+ LocalFree.arg_types = [HLOCAL]
+
+ def arg_split(commandline, posix=False):
+ """Split a command line's arguments in a shell-like manner.
+
+ This is a special version for windows that use a ctypes call to CommandLineToArgvW
+ to do the argv splitting. The posix paramter is ignored.
+ """
+ #CommandLineToArgvW returns path to executable if called with empty string.
+ if commandline.strip() == "":
+ return []
+ argvn = c_int()
+ result_pointer = CommandLineToArgvW(py3compat.cast_unicode(commandline.lstrip()), ctypes.byref(argvn))
+ result_array_type = LPCWSTR * argvn.value
+ result = [arg for arg in result_array_type.from_address(result_pointer)]
+ retval = LocalFree(result_pointer)
+ return result
+except AttributeError:
+ import shlex
+ #alternative if CommandLineToArgvW is not available
+ def arg_split(s, posix=False):
+ """Split a command line's arguments in a shell-like manner.
+
+ This is a modified version of the standard library's shlex.split()
+ function, but with a default of posix=False for splitting, so that quotes
+ in inputs are respected."""
+
+ # Unfortunately, python's shlex module is buggy with unicode input:
+ # http://bugs.python.org/issue1170
+ # At least encoding the input when it's unicode seems to help, but there
+ # may be more problems lurking. Apparently this is fixed in python3.
+ is_unicode = False
+ if (not py3compat.PY3) and isinstance(s, unicode):
+ is_unicode = True
+ s = s.encode('utf-8')
+ lex = shlex.shlex(s, posix=posix)
+ lex.whitespace_split = True
+ tokens = list(lex)
+ if is_unicode:
+ # Convert the tokens back to unicode.
+ tokens = [x.decode('utf-8') for x in tokens]
+ return tokens

0 comments on commit 2381b09

Please sign in to comment.