¿Cómo puedo obtener el nombre / archivo del script desde sitecustomize.py?

Cuando ejecuto cualquier secuencia de comandos de Python, me gustaría ver el nombre de archivo de la secuencia de comandos en la barra de título de la ventana de línea de comandos de Windows. Por ejemplo, si ejecuto un script llamado ” mytest.py “, quiero ver ” mytest ” en la barra de título. Me gustaría que esto fuera automático, por lo que no tengo que agregar código a cada uno de mis scripts.

Actualmente estoy intentando hacer esto con sitecustomize.py , porque cuando se ejecuta Python, incluso al hacer doble clic en un script de Python, se importa sitecustomize antes de que se ejecute el script.

He intentado obtener __main__ ‘s __file__ y sys.argv , pero sitecustomize no ve tampoco:

archivo sitecustomize.py :

 import __main__, sys print "hasattr __main__.__file__:", hasattr(__main__, "__file__") print "hasattr sys.argv:", hasattr(sys, "argv") print "-" * 60 

archivo mytest.py :

 import sys print "__file__ is:", __file__ print "sys.argv is:", sys.argv raw_input() # don't end the script immediately 

salida:

 hasattr __main__.__file__: False hasattr sys.argv: False ------------------------------------------------------------ __file__ is: C:\Documents and Settings\Owner\Desktop\mytest.py sys.argv is: ['C:\\Documents and Settings\\Owner\\Desktop\\mytest.py'] 

Me alegra que hayas preguntado! Ahora lo tengo funcionando para mis scripts, y es bastante bueno.

Aquí está el código:

 import sys import time from ctypes import windll class SetTitle(object): def __del__(self): time.sleep(1) command = ' '.join(sys.argv) windll.kernel32.SetConsoleTitleA(command) sys.argv = SetTitle() 

Esto es para Python 2.x – para 3.x necesita cambiar SetConsoleTitleA a SetConsoleTitleW (la última letra cambia de A a W).

Cómo funciona: dado que el objeto sys.argv todavía existe, creo un objeto y lo asigno a sys.argv; luego, cuando Python asigna el argumento real a sys.argv, mi objeto se lanza y se __del__ método __del__ ; __del__ método __del__ puede entonces acceder al argumento real y configurar la barra de título en consecuencia. Puse el sueño de 1 segundo para evitar cualquier posible condición de carrera, pero no estoy seguro de que sea necesario. Si no desea ver todos los argumentos de la línea de comando, puede preprocesar el comando de la forma que desee.

Mi agradecimiento a la gente en la lista de correo python-win32, y a Thomas Heller en particular, por ayudar con la parte de ‘título establecido’ de esta pregunta.

Cuando ejecuto cualquier secuencia de comandos de Python, me gustaría ver el nombre de archivo de la secuencia de comandos en la barra de título de la ventana de línea de comandos de Windows. Por ejemplo, si ejecuto un script llamado “mytest.py”, quiero ver “mytest” en la barra de título. Me gustaría que esto fuera automático, por lo que no tengo que agregar código a cada uno de mis scripts.

Creo que deberías agregar esta funcionalidad a todos tus scripts mediante un módulo y no hackearlo en sitecustomize.py. Además, incluso si aún desea seguir la ruta de personalización del sitio, deberá pasar __file__ de su secuencia de comandos, lo que significa que no podrá agregar algún código a todas sus secuencias de comandos.

Lo que sí puedes hacer es colocar ese código en un módulo y luego importarlo en todos tus scripts de Python. Como mencioné anteriormente, debe pasar __file__ de su script principal, de lo contrario obtendrá el nombre de archivo de los módulos. Tampoco es necesario importar __main__ para recuperar __file__ .