Existen cuatro casos sólidos para preferir los métodos más específicos de Python en el os
módulo en lugar de usar os.system
o el subprocess
módulo al ejecutar un comando:
- Redundancia : generar otro proceso es redundante y desperdicia tiempo y recursos.
- Portabilidad : muchos de los métodos en el
os
módulo están disponibles en varias plataformas, mientras que muchos comandos de shell son específicos de os.
- Comprender los resultados : generar un proceso para ejecutar comandos arbitrarios te obliga a analizar los resultados de la salida y comprender si un comando ha hecho algo mal y por qué .
- Seguridad : un proceso puede ejecutar potencialmente cualquier comando que se le dé. Este es un diseño débil y se puede evitar utilizando métodos específicos en el
os
módulo.
En realidad, está ejecutando un "intermediario" redundante en su camino a las llamadas eventuales del sistema ( chmod
en su ejemplo). Este intermediario es un nuevo proceso o sub-shell.
De os.system
:
Ejecute el comando (una cadena) en una subshell ...
Y subprocess
es solo un módulo para generar nuevos procesos.
Puede hacer lo que necesita sin generar estos procesos.
El os
objetivo del módulo es proporcionar servicios genéricos del sistema operativo y su descripción comienza con:
Este módulo proporciona una forma portátil de utilizar la funcionalidad dependiente del sistema operativo.
Puede usar os.listdir
tanto en Windows como en Unix. Intentar usar os.system
/ subprocess
para esta funcionalidad te obligará a mantener dos llamadas (para ls
/ dir
) y verificar en qué sistema operativo estás. Esto no es tan portátil y va a causar frustración aún más adelante (véase Salida de gestión ).
Comprender los resultados del comando:
Suponga que desea enumerar los archivos en un directorio.
Si está utilizando os.system("ls")
/ subprocess.call(['ls'])
, solo puede recuperar la salida del proceso, que es básicamente una cadena grande con los nombres de archivo.
¿Cómo puede distinguir un archivo con un espacio en su nombre de dos archivos?
¿Qué sucede si no tiene permiso para enumerar los archivos?
¿Cómo debe asignar los datos a los objetos de Python?
Estos solo están fuera de mi cabeza, y si bien hay soluciones a estos problemas, ¿por qué resolver de nuevo un problema que se resolvió para usted?
Este es un ejemplo de la siguiente No te repitas principio (A menudo aduana mencionados como "seco") por no repetir una implementación que ya existe y está disponible gratuitamente para usted.
La seguridad:
os.system
y subprocess
son poderosos Es bueno cuando necesitas este poder, pero es peligroso cuando no lo necesitas. Cuando lo usa os.listdir
, sabe que no puede hacer nada más que enumerar archivos o generar un error. Cuando usa os.system
o subprocess
para lograr el mismo comportamiento, puede terminar haciendo algo que no quiso hacer.
Seguridad de inyección (ver ejemplos de inyección de conchas ) :
Si usa la entrada del usuario como un nuevo comando, básicamente le ha dado un shell. Esto es muy parecido a la inyección SQL que proporciona un shell en la base de datos para el usuario.
Un ejemplo sería un comando de la forma:
# ... read some user input
os.system(user_input + " some continutation")
Esto puede explotarse fácilmente para ejecutar cualquier código arbitrario utilizando la entrada: NASTY COMMAND;#
para crear el eventual:
os.system("NASTY COMMAND; # some continuation")
Hay muchos de estos comandos que pueden poner en riesgo su sistema.