2011-02-01 10 views
9

Quiero obtener el verdadero valor del argv [0] del sistema operativo en un programa de Python. Python's sys.argv [0] no es este valor: es el nombre del script de Python que se está ejecutando (con algunas excepciones). Lo que quiero es un foo.py que imprimirá "somestring" cuando se ejecuta como¿Cómo se puede obtener el argv del sistema operativo [0] (no sys.argv [0]) en Python?

El programa trivial

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

imprimirá "foo.py" en su lugar.

¿Alguien sabe cómo obtener esto? Hay algunas funciones relacionadas en la API de Python C: p. Py_GetProgramName. Pero esto no parece estar expuesto al mundo de Python en ninguna parte. Py_GetProgramFullPath funciona fuera de argv [0] pero lo intenta obtener una ruta a un intérprete de Python. (Este valor se propaga a sys.executable, por lo que esa variable tampoco está bien.) ¿Realmente tengo que escribir un módulo C para obtener este valor?

Editar: También se le preguntó (pero no respondió amablemente) here.

Respuesta

7

En Linux se puede leer el contenido de /proc/self/cmdline:

#!/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')) 

y la salida es:

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

Parece que hay un error en bash El comando exec reemplaza el cierre cáscara la sesión de la terminal después de que el intérprete finaliza. Ese es el primer golpe para.

+0

No es un error de bash, el comando 'exec' reemplaza el shell con otro programa. – interjay

+0

Ooh, tortuoso. No me sorprendería si esto tuviera problemas de portabilidad, pero es bueno para mí. – pkgw

+0

@interjay Ya veo, ¡gracias! – vz0

Cuestiones relacionadas