""" Helper functions for interacting with the shell, and consuming shell-style parameters provided in config files. """ import os import shlex import subprocess try: from shlex import quote except ImportError: from pipes import quote __all__ = ['WindowsParser', 'PosixParser', 'NativeParser'] class CommandLineParser: """ An object that knows how to split and join command-line arguments. It must be true that ``argv == split(join(argv))`` for all ``argv``. The reverse neednt be true - `join(split(cmd))` may result in the addition or removal of unnecessary escaping. """ @staticmethod def join(argv): """ Join a list of arguments into a command line string """ raise NotImplementedError @staticmethod def split(cmd): """ Split a command line string into a list of arguments """ raise NotImplementedError class WindowsParser: """ The parsing behavior used by `subprocess.call("string")` on Windows, which matches the Microsoft C/C++ runtime. Note that this is _not_ the behavior of cmd. """ @staticmethod def join(argv): # note that list2cmdline is specific to the windows syntax return subprocess.list2cmdline(argv) @staticmethod def split(cmd): import ctypes # guarded import for systems without ctypes try: ctypes.windll except AttributeError: raise NotImplementedError # Windows has special parsing rules for the executable (no quotes), # that we do not care about - insert a dummy element if not cmd: return [] cmd = 'dummy ' + cmd CommandLineToArgvW = ctypes.windll.shell32.CommandLineToArgvW CommandLineToArgvW.restype = ctypes.POINTER(ctypes.c_wchar_p) CommandLineToArgvW.argtypes = (ctypes.c_wchar_p, ctypes.POINTER(ctypes.c_int)) nargs = ctypes.c_int() lpargs = CommandLineToArgvW(cmd, ctypes.byref(nargs)) args = [lpargs[i] for i in range(nargs.value)] assert not ctypes.windll.kernel32.LocalFree(lpargs) # strip the element we inserted assert args[0] == "dummy" return args[1:] class PosixParser: """ The parsing behavior used by `subprocess.call("string", shell=True)` on Posix. """ @staticmethod def join(argv): return ' '.join(quote(arg) for arg in argv) @staticmethod def split(cmd): return shlex.split(cmd, posix=True) if os.name == 'nt': NativeParser = WindowsParser elif os.name == 'posix': NativeParser = PosixParser
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
checks | Folder | 0755 |
|
|
command | Folder | 0755 |
|
|
fcompiler | Folder | 0755 |
|
|
mingw | Folder | 0755 |
|
|
tests | Folder | 0755 |
|
|
__config__.py | File | 5.02 KB | 0644 |
|
__init__.py | File | 2.03 KB | 0644 |
|
__init__.pyi | File | 119 B | 0644 |
|
_shell_utils.py | File | 2.55 KB | 0644 |
|
armccompiler.py | File | 962 B | 0644 |
|
ccompiler.py | File | 27.95 KB | 0644 |
|
ccompiler_opt.py | File | 97.98 KB | 0644 |
|
conv_template.py | File | 9.31 KB | 0644 |
|
core.py | File | 7.98 KB | 0644 |
|
cpuinfo.py | File | 22.11 KB | 0644 |
|
exec_command.py | File | 10.04 KB | 0644 |
|
extension.py | File | 3.48 KB | 0644 |
|
from_template.py | File | 7.73 KB | 0644 |
|
fujitsuccompiler.py | File | 834 B | 0644 |
|
intelccompiler.py | File | 4.13 KB | 0644 |
|
lib2def.py | File | 3.54 KB | 0644 |
|
line_endings.py | File | 1.98 KB | 0644 |
|
log.py | File | 2.81 KB | 0644 |
|
mingw32ccompiler.py | File | 21.55 KB | 0644 |
|
misc_util.py | File | 87.26 KB | 0644 |
|
msvc9compiler.py | File | 2.14 KB | 0644 |
|
msvccompiler.py | File | 2.58 KB | 0644 |
|
npy_pkg_config.py | File | 12.67 KB | 0644 |
|
numpy_distribution.py | File | 634 B | 0644 |
|
pathccompiler.py | File | 713 B | 0644 |
|
setup.py | File | 634 B | 0644 |
|
system_info.py | File | 110.53 KB | 0644 |
|
unixccompiler.py | File | 5.3 KB | 0644 |
|