2015-02-05 20 views
16

Komut satırı argümanlarını geri alın another question here'dan ilham alarak, Python yorumlayıcısının tam komut satırını taşınabilir bir şekilde almak istiyorum. Yani, tercümanın kendisinin (-m, -O, vb. Gibi) seçeneklerini hariç tutan sys.argv'u değil, orijinal argv yorumunu almak istiyorum.Python yorumlayıcısı

sys.flags, hangi boole seçeneklerinin ayarlandığını bize söyler, ancak bize -m argümanlarını anlatmaz ve bayrak kümesi zamanla değişmek zorunda kalır ve bakım yükü oluşturur.

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

kullanabilirsiniz: özgün komut satırını almak için procfs kullanabilirsiniz, ancak bu taşınabilir değil (ve bir çeşit iğrenç) Linux'ta

Harika bir soru ... Anlayabildiğim kadarıyla bu mümkün değil (CPython'da). Bana [Py_Main] (https://hg.python.org/cpython/file/2bb5fa752bfc/Modules/main.c#l236) komut satırı argümanlarını almak için ayrıştırıyor gibi görünüyor, sonra [PySys_SetArgv] (https: //hg.python.org/cpython/file/2bb5fa752bfc/Modules/main.c#l571) kalan argümanlar ile ve '* argc' ve' ** argv' ile başka hiçbir şey yapmaz. Muhtemelen bağlayabileceğimiz [Py_GetArgcArgv] (https://hg.python.org/cpython/file/2bb5fa752bfc/Modules/main.c#l691) var, ama belgelenmiş bir yerde göremiyorum. C-API ... – mgilson

+1

'.split ('\ 0')', .replace ('\ 0', '') 'yerine daha doğru olur - aksi takdirde boşluk ve bağımsız değişkenler içeren argümanlar arasında ayrım yapamazsınız. – tripleee

cevap

10

Bunun bir olduğunu 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'