2011-02-01 17 views
9

Bir Python programında işletim sisteminin argv [0] gerçek değerini elde etmek istiyorum. Python'un sys.argv [0] değeri bu değer değildir: yürütülmekte olan Python betiğinin adıdır (bazı istisnalar hariç). İstediğim yerine "foo.py" yazdırırİşletim Sisteminin Python'daki argv [0] (sys.argv [0] değil) nasıl elde edilir?

önemsiz programı

#! /usr/bin/env python 
import sys 
print sys.argv[0] 

olarak çalıştırıldığında "someString" yazdırır bir foo.py olduğunu.

Bunu nasıl elde edeceğini bilen var mı? Python C API'sinde bazı ilgili işlevler vardır: ör. Py_GetProgramName. Ancak bu, Python dünyasına herhangi bir yerde maruz kalıyor gibi görünmüyor. Py_GetProgramFullPath argv [0] 'dan çalışır, ancak bir Python yorumlayıcısının yolunu bulmaya çalışır. (Bu değer sys.executable için yayılır, böylece değişken de doğru değildir.) Bu değeri almak için gerçekten C modülü yazmam gerekiyor mu?

Düzeltme: Ayrıca (ama yardımcı olmadı yanıtlanan) here.

#!/usr/bin/env python 
import sys 
print sys.argv[0] 

f = open('/proc/self/cmdline', 'rb') 
cmdline = f.read() 
f.close() 

print repr(cmdline.split('\x00')) 

Ve çıkışı:

Linux'ta

cevap

7

Eğer /proc/self/cmdline içeriğini okuyabilir

$ bash 
$ exec -a "somestring" python foo.py 
foo.py 
['somestring', 'foo.py', ''] 

bash exec komutu bir hata var gibi görünüyor kabuk kapanmasını değiştirir tercüman çıktıktan sonra terminal oturumu. Bu ilk bash için.

+0

Bu bir bash hatası değil, 'exec' komutu kabuğu başka bir programla değiştirir. – interjay

+0

Ooh, şeytan. Bu taşınabilirlik sorunları varsa şaşırmazdım ama benim için iyi. – pkgw

+0

@interjay Görüyorum, teşekkürler! – vz0