Search code examples
pythoncommand-linecommand-line-argumentsargv

Retrieve the command line arguments of the Python interpreter


Inspired by another question here, I would like to retrieve the Python interpreter's full command line in a portable way. That is, I want to get the original argv of the interpreter, not the sys.argv which excludes options to the interpreter itself (like -m, -O, etc.).

sys.flags tells us which boolean options were set, but it doesn't tell us about -m arguments, and the set of flags is bound to change over time, creating a maintenance burden.

On Linux you can use procfs to retrieve the original command line, but this is not portable (and it's sort of gross):

open('/proc/{}/cmdline'.format(os.getpid())).read().split('\0')

Solution

  • You can use ctypes

    ~$ python2 -B -R -u
    Python 2.7.9 (default, Dec 11 2014, 04:42:00) 
    [GCC 4.9.2] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    Persistent session history and tab completion are enabled.
    >>> import ctypes
    >>> argv = ctypes.POINTER(ctypes.c_char_p)()
    >>> argc = ctypes.c_int()
    >>> ctypes.pythonapi.Py_GetArgcArgv(ctypes.byref(argc), ctypes.byref(argv))
    1227013240
    >>> argc.value
    4
    >>> argv[0]
    'python2'
    >>> argv[1]
    '-B'
    >>> argv[2]
    '-R'
    >>> argv[3]
    '-u'