2015-02-05 21 views
16

Ispirato allo another question here, vorrei recuperare la riga di comando completa dell'interprete Python in modo portatile. Cioè, voglio ottenere l'originale argv dell'interprete, non lo sys.argv che esclude le opzioni all'interprete stesso (come -m, -O, ecc.).Recupera gli argomenti della riga di comando dell'interprete Python

sys.flags ci dice quali opzioni booleane sono state impostate, ma non ci parla degli argomenti -m e l'insieme di flag è destinato a cambiare nel tempo, creando un onere di manutenzione.

Su Linux è possibile utilizzare procfs per recuperare la riga di comando originale, ma questo non è portabile (ed è una sorta di lordo):

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

questo è un ottima domanda ... Per quanto posso dire, questo non è possibile (in CPython). Mi sembra come [Py_Main] (https://hg.python.org/cpython/file/2bb5fa752bfc/Modules/main.c#l236) esegue qualche analisi per ottenere gli argomenti della riga di comando, quindi chiama [PySys_SetArgv] (https: //hg.python.org/cpython/file/2bb5fa752bfc/Modules/main.c#l571) con gli argomenti rimanenti e non fa nient'altro con '* argc' e' ** argv'. C'è [Py_GetArgcArgv] (https://hg.python.org/cpython/file/2bb5fa752bfc/Modules/main.c#l691), che probabilmente potresti collegare a - Ma non lo vedo da nessuna parte nel documentato C-API ... – mgilson

+1

'.split ('\ 0')' sarebbe più corretto di '.replace ('\ 0', '')' - altrimenti non è possibile distinguere tra argomenti contenenti uno spazio e argomenti separati. – tripleee

risposta

10

È possibile utilizzare 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' 
Problemi correlati