Segun se invoque programa.py

Hernan M Foffani hfoffani en gmail.com
Vie Sep 25 12:04:26 CEST 2009


>> lasizoillo ha escrito: "...  busca algún argv[0] por el código (es la
>> variable con el nombre del programa), que creo que van a ir por allí los
>> tiros ;-) "
>>
>> * ¡Exacto!. :-) La clave está aquí:
>>
>> #directories
>> PREFIX=os.path.split(os.path.split(sys.argv[0])[0])[0]
>> DATADIR=os.path.join(PREFIX,'share','openastro.org')
>>
>>  Es decir; que el programa obtiene el camino en el que se está ejecutando
>> la aplicación, y de éste deduce dónde se encuentra la carpeta
>> "openastro.org". En este caso, está en "/usr/share" Por lo tanto se arregla
>> creando la carpeta "share" en el mismo camino en que se encuentra
>> "programa.py", y copiando dentro de "share" la carpeta "openastro.org" que
>> necesita la aplicación. El problema ya ha sido resuelto pero me queda la
>> curiosidad  de que "programa.py" está en el mismo directorio que los
>> ejecutables de python; es decir: "/usr/bin", y su carpeta "openastro.org",
>> se instala en "/usr/share".  ¿Porqué cuando se invoca con el nombre del
>> programa, éste encuentra su carpeta de trabajo en "/usr/share", y cuando se
>> invoca con Python o el entorno de desarrollo no?. Debe ser alguna
>> particularidad de Linux/Unix que desconozco...
>
>
> El porqué del falló está clarísimo ...
>
> ----------- /usr/local/bin/test.py ------------------
> #!/usr/bin/python
>
> import sys
> import os
>
> print sys.argv[0]
> print os.path.split(os.path.split(sys.argv[0])[0])[0]
> ---------------------------------------------------------
>
> chmod +x /usr/local/bin/test.py
>
> Ahora lo invocamos desde cualquier sitio:
> salma:~# test.py
> /usr/local/bin/test.py
> /usr/local
>
> salma:~# python /usr/local/bin/test.py
> /usr/local/bin/test.py
> /usr/local
>
> Ahora lo invocamos desde /usr/local/bin
> salma:~# cd /usr/local/bin/
> salma:/usr/local/bin# ./test.py
> ./test.py
>
>
> Meeeeeeeccccccc ... ¿ves el error?, no puedes usar sys.argv[0], tan
> alegremente ... para este tipo de cosas, lo mejor es un archivo de
> configuración donde guardar esos valores.

Hombre... Si sabes qué contiene sys.argv[0] lo puedes usar sin sentir
tristeza. ;-)
Para no complicarme la vida he optado por dos esquemas simples y
excluyentes. O empaqueto todo (python puro) y lo mando a site-packages
via un .egg, o distribuyo mediante instaladores nativos en cuyo caso
incluyo mi propio intérprete.

Para el caso original de J.M.Puertas, una modificación pequeña al
script reemplazando sys.argv[0] por __file__ y un par de cosillas mas
quizás sería suficiente.
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es