Uno dei problemi con system()
è che implica la conoscenza della sintassi e del linguaggio della shell per l'analisi e l'esecuzione della riga di comando. Questo crea potenziale per un bug in cui non hai validato correttamente l'input, e la shell potrebbe intercettare qualcosa come la sostituzione di variabili o determinare dove un argomento inizia o finisce in un modo che non ti aspetti. Inoltre, la shell di un altro OS potrebbe avere una sintassi divergente dalla tua, compresa una divergenza molto sottile che non noterai subito. Per ragioni come queste preferisco usare execve()
invece di system()
- puoi passare direttamente token argv
e non devi preoccuparti di qualcosa nel mezzo (mis-) analizzare il tuo input.
Un altro problema con (questo vale anche per l'utilizzo di execve()
) è che quando si esegue il codice, si sta dicendo "cerca questo programma e passa questi argomenti". Questo fa un paio di assunzioni che possono portare a bug. Il primo è che il programma esiste e può essere trovato in $PATH
. Forse su qualche sistema non lo farà. Secondo, forse su qualche sistema, o anche su una versione futura del proprio sistema operativo, supporterà un diverso insieme di opzioni. In questo senso, eviterei di farlo a meno che non siate assolutamente certi che il sistema su cui girerete avrà il programma. (Come forse hai messo il programma callee sul sistema per cominciare, o il modo in cui lo invocate è mandato da qualcosa come POSIX.)
Infine ... C'è anche un colpo di prestazioni associato alla ricerca del programma giusto, creare un nuovo processo, caricare il programma, ecc.Se stai facendo qualcosa di semplice come un mv
, è molto più efficiente usare direttamente la chiamata di sistema.
Questi sono solo alcuni dei motivi per evitare system()
. Sicuramente ce ne sono di più.
Una cosa da notare oltre alle risposte finora, usando Python come linguaggio "colla" può facilmente sfuggire di mano. Se hai un programma che è quasi interamente l'esecuzione automatica di cose fatte facilmente su una riga di comando, e non sei preoccupato per i sistemi non Unix, perché non usare solo uno script di shell? –
Utilizzare il modulo del processo secondario anziché os.system. Se vuoi un qualche tipo di controllo sul processo, sarai grato. –