2011-12-05 15 views
5

Sto riscontrando problemi nell'effettuare l'escape delle chiamate alla shell da Python, utilizzando il comando os.system. Sto cercando di fare l'equivalente di:gestisce correttamente l'escaping di shell da Python utilizzando os.system

$ cat test | sort --stable -t $'\t' -k1,1 

dall'interno Python, passaggio che alla shell.

Ho provato:

import os 
cmd = "cat %s | sort --stable -t $'\\t' -k1,1" %("test") 
os.system(cmd) 

ma ottengo l'errore:

sort: multi-character tab `$\\t' 

anche se funziona correttamente dalla shell. Ho provato a sfuggire allo \t aggiungendo una barra in più in Python, ma mi manca qualcos'altro. Qualche idea su come può essere risolto?

grazie.

+0

è possibile passare il nome del file come arg per ordinare, e saltare il 'cat file |'. In bocca al lupo. – shellter

risposta

5

os.system non esegue comandi in un normale ambiente di bash come ci si aspetterebbe. È possibile lavorare intorno ad esso semplicemente chiamando colpire te stesso:

import os 
cmd = """/bin/bash -c "cat %s | sort --stable -t $'\t' -k1,1" """ % "test" 
os.system(cmd) 

Ma si deve essere consapevoli che os.system è stato contrassegnato come deprecato, e sarà rimosso nelle future versioni di pitone. È possibile a prova di futuro il codice utilizzando subprocess 'metodo s convenienza call che imita os.system' s comportamento:

import subprocess 
cmd = """/bin/bash -c "cat %s | sort --stable -t $'\t' -k1,1" """ % "test" 
subprocess.call(cmd, shell=True) 

Non ci sono altri modi per fare quella chiamata con il modulo sottoprocesso, se siete interessati:

http://docs.python.org/library/subprocess.html#module-subprocess

1

Per prima cosa, si dovrebbe evitare l'uso inutile del gatto: http://google.com/search?q=uuoc.

In secondo luogo, sei sicuro che il comando di ordinamento non comprenda il backslash-t? Questo dovrebbe funzionare:

sort --stable -t'\t' -k1,1 test 

dovrebbe funzionare anche bene da Python:

os.system("sort --stable -t'\\t' -k1,1 test") 
# or 
os.system(r"sort --stable -t'\t' -k1,1 test") 

Infine, se si passa a subprocess (consigliato), evitare di utilizzare shell=True:

subprocess.call(["sort", "--stable", "-t\t", "-k1,1", "test"]) 
Problemi correlati