12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- """Get Unicode argv strings in Python 2 on Windows
- get_full_unicode_argv based on
- http://code.activestate.com/recipes/572200/
- argv_setter_hook based on
- https://mail.python.org/pipermail/python-list/2016-June/710183.html
- """
- import sys
- from ctypes import WinDLL, c_int, POINTER, byref
- from ctypes.wintypes import LPCWSTR, LPWSTR
- kernel32 = WinDLL("kernel32", use_last_error=True)
- shell32 = WinDLL("shell32", use_last_error=True)
- GetCommandLineW = kernel32.GetCommandLineW
- GetCommandLineW.argtypes = ()
- GetCommandLineW.restype = LPCWSTR
- CommandLineToArgvW = shell32.CommandLineToArgvW
- CommandLineToArgvW.argtypes = (LPCWSTR, POINTER(c_int))
- CommandLineToArgvW.restype = POINTER(LPWSTR)
- LocalFree = kernel32.LocalFree
- def get_full_unicode_argv():
- cmd = GetCommandLineW()
- argc = c_int(0)
- argv = CommandLineToArgvW(cmd, byref(argc))
- py_argv = [arg for i, arg in zip(range(argc.value), argv)]
- LocalFree(argv)
- return py_argv
- def get_unicode_argv():
- if original_argv == [""]:
- return [u""]
-
- new_argv = get_full_unicode_argv()[-len(original_argv):]
-
- if original_argv[0] == "-c":
- new_argv[0] = u"-c"
-
- return new_argv
- original_argv = None
- def argv_setter_hook(path):
- global original_argv
-
- if original_argv is not None: # already got it
- raise ImportError
-
- try:
- original_argv = sys.argv
- except AttributeError:
- pass
- else:
- enable()
- finally:
- raise ImportError
- def enable():
- global original_argv
-
- if original_argv is None:
- try:
- original_argv = sys.argv
- except AttributeError: # in sitecustomize in Python 2
- sys.path_hooks[:0] = [argv_setter_hook]
- return
-
- sys.argv = get_unicode_argv()
- def disable():
- if original_argv is not None:
- sys.argv = original_argv
|