Uno de los problemas con system()
es que implica el conocimiento de la sintaxis y el lenguaje del shell para analizar y ejecutar su línea de comandos. Esto crea la posibilidad de un error en el que no validar la entrada correctamente, y el intérprete de comandos puede impulsar algo así como la sustitución de variables o determinar dónde comienza o termina un argumento de una manera que no espera. Además, el shell de otro sistema operativo puede tener una sintaxis divergente de la suya, incluida una divergencia muy sutil que no notará de inmediato. Por razones como estas prefiero usar execve()
en lugar de system()
- puede pasar tokens argv
directamente y no tener que preocuparse por algo en el medio (error-) al analizar su entrada.
Otro problema con system()
(esto también se aplica al uso de execve()
) es que cuando se codifica eso, se está diciendo, "busque este programa, y páselo por args". Esto hace un par de suposiciones que pueden conducir a errores. Primero es que el programa existe y se puede encontrar en $PATH
. Tal vez en algún sistema no lo hará. En segundo lugar, tal vez en algún sistema, o incluso en una versión futura de su propio SO, admitirá un conjunto diferente de opciones. En este sentido, evitaría hacer esto a menos que esté absolutamente seguro de que el sistema en el que se ejecutará tendrá el programa. (Al igual que quizás pusiste el programa callee en el sistema para empezar, o la forma en que lo invocas es algo así como POSIX.)
Por último ... También hay un impacto en el rendimiento asociado con buscar el programa correcto, creando un nuevo proceso, cargando el programa, etc.Si está haciendo algo simple como mv
, es mucho más eficiente usar la llamada del sistema directamente.
Estas son solo algunas de las razones para evitar system()
. Seguramente hay más.
Una cosa a tener en cuenta, además de las respuestas hasta ahora, el uso de Python como un lenguaje "pegamento" puede salir de control fácilmente. Si tiene un programa que es casi completamente la ejecución automatizada de cosas fáciles de hacer en una línea de comando, y no le preocupan los sistemas que no son Unixish, ¿por qué no simplemente usar un script de shell? –
Utilice el módulo de subproceso en lugar de os.system. Si quieres algún tipo de control sobre el proceso, estarás agradecido. –