Digamos que tenemos un script de Python do.py
y queremos poder llamarlo sin extensión, como do
o ./do
.Cómo ejecutar una secuencia de comandos python sin especificar la extensión de archivo (solución multiplataforma)?
Si cambiamos el nombre del archivo de do.py
a do
y aseguramos que tenemos una línea de shebang válida, funcionará para todas las plataformas excepto para Windows. En Windows no hay forma de ejecutar el archivo sin extensión.
En Windows, si conservamos la extensión de archivo original, podremos llamar al script sin el nombre completo porque el instalador de Python registra la extensión .py
como ejecutable.
Parece que tenemos que entregar la misma secuencia de comandos bajo dos nombres diferentes para llamarlo en entornos Windows y que no sean de Windows. Realmente no me gusta esto y estoy buscando una solución sin esta redundancia.
Otro enfoque común en esto es agregar un archivo por lotes contenedor do.cmd
que llama al archivo original do.py
. Esto tiene por lo menos un problema importante: lo hace romper el Ctrl + C/Ctrl + INTER porque no hay manera de prevenir cmd.exe
de instándole con Terminate batch job? (Y/N) message.
Si vamos a utilizar un envoltorio que tenemos que ser Asegúrese de que:
- retorno del código de error (nivel de error) devuelto por el guión original
- no va a cambiar el entorno
- va a volver a utilizar la misma consola (no hay ventanas nuevas)
- no interfiere con la salida estándar, STDIN o STDERR
- ser amigable con Ctrl-C (no hay indicaciones)
supongo que la solución óptima es todavía utilizar un envoltorio. Batch no funcionará, el ejecutable nativo agregaría mucha complejidad, por lo que probablemente un wrapper escrito en python haría lo mismo.
La respuesta puede ser la pregunta "¿por qué quieres llamar sin extensión?" –
Wow, qué mucho trabajo sin ningún beneficio real. ¿Qué pasa con do.py? Eso es perfectamente multiplataforma sin ningún trabajo. –
Para aquellos que se preguntan: sin extensión significa que ocultamos los detalles de implementación: por ejemplo, si el próximo año quiero reemplazar la secuencia de comandos de Python actual con una secuencia de comandos de Ruby, no quiero tener que cambiar todas las llamadas al script. Otro argumento menos importante: menos para escribir desde la línea de comandos. – sorin