2012-07-30 20 views
6

Estoy usando Python y Envoy. Necesito eliminar todos los archivos en un directorio. Además de algunos archivos, el directorio está vacío. En un terminal de esto sería:Usando rm * (comodín) en el destinatario: Ningún archivo o directorio

rm /tmp/my_silly_directory/* 

El sentido común dicta que el enviado, esto se traduce en:

r = envoy.run('rm /tmp/my_silly_directory/*') 

Sin embargo:

r.std_err -> "rm: cannot remove `/tmp/my_silly_directory/*': No such file or directory" 

Naturalmente, hay alternativas al uso de enviado en este caso, simplemente me pregunto por qué no funciona.

¿Alguna pista?

Respuesta

5

En UNIX, depende del shell interpretar comodines como *. Si ejecuta un programa y pasa un argumento con * directamente al programa, que es lo que se está haciendo aquí, entonces obtendrá un error como el que está viendo. rm simplemente asume que el * es un nombre de archivo, y de hecho, es posible crear dicho archivo.

Una solución podría ser para ejecutar la cáscara y dejar que se ejecute el comando en su nombre, algo así como

r = envoy.run('sh -c "rm /tmp/my_silly_directory/*"') 

La cáscara interpretará el * antes de invocar rm.

+0

Esto suena perfectamente bien, y probablemente funcione con subproceso. Sin embargo, en enviado, la única llamada que funciona es 'envoy.run ([[" sh "," -c "," rm/tmp/my_silly_directory/* "]])' por algún motivo. Tanto para un "subproceso" más simple;) –

+0

no pudo hacer que esto funcione con un subproceso, por cierto. Mismo error que la pregunta original. – Nate

+0

@Nate: ['shutil.rmtree ('/ tmp/my_silly_directory /')'] (http://stackoverflow.com/questions/9106350/how-to-use-wildcards-with-envoy?lq=1#comment15551439_9109127) – jfs

Cuestiones relacionadas