2012-07-30 7 views
6

Ich benutze Python und Envoy. Ich muss alle Dateien in einem Verzeichnis löschen. Abgesehen von einigen Dateien ist das Verzeichnis leer. In einem Terminal wäre dies:Verwenden von rm * (Wildcard) in envoy: Keine solche Datei oder Verzeichnis

rm /tmp/my_silly_directory/* 

gesunde Menschenverstand sagt, dass in envoy, dies schlägt sich in:

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

jedoch:

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

Natürlich gibt es Alternativen zur Verwendung von envoy in diesem Fall, ich frage mich einfach, warum es nicht funktioniert.

Irgendwelche Hinweise?

Antwort

5

Unter UNIX ist es die Shell, Wildcards wie * zu interpretieren. Wenn Sie ein Programm ausführen und ein Argument mit * darin direkt an das Programm übergeben - was vermutlich hier geschieht - dann erhalten Sie einen Fehler, wie Sie sehen. rm nimmt nur an, * ist ein Dateiname, und tatsächlich ist es tatsächlich möglich, eine solche Datei zu erstellen.

Eine Lösung könnte sein, die Shell ausführen und lassen Sie es Ihren Befehl in Ihrem Namen ausführen, so etwas wie

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

Die Schale der * vor dem Aufruf rm interpretiert.

+0

Das klingt vollkommen richtig und würde wahrscheinlich mit Subprozess arbeiten. Der einzige Aufruf, der in envoy funktioniert, ist 'envoy.run ([[" sh "," -c "," rm/tmp/my_silly_directory/* "]])' aus irgendeinem Grund. So viel zu einem einfacheren "Subprozess";) –

+0

konnte dies übrigens nicht mit Subprozess arbeiten. Derselbe Fehler wie die ursprüngliche Frage. – Nate

+0

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