2009-09-08 10 views
11

In meinem aktuellen Arbeitsverzeichnis habe ich das Verzeichnis ROOT/mit einigen Dateien drin.Problem mit subprocess.call

Ich weiß, ich kann cp -r ROOT/* /dst exec ausführen und ich habe keine Probleme.

Aber wenn ich meine Python-Konsole zu öffnen und ich schreibe dies:

import subprocess 
subprocess.call(['cp', '-r', 'ROOT/*', '/dst']) 

Es funktioniert nicht!

Ich habe diesen Fehler: cp: cannot stat ROOT/*: No such file or directory

Können Sie mir helfen?

+1

In diesem Beispiel sollten Sie wahrscheinlich einfach ['shuthil.copytree'] (http://docs.python.org/library/shutil.html#shutil.copytree) verwenden, was genau das tut (rekursives Kopieren von Verzeichnissen). . – naught101

Antwort

4

Die * wird nicht zu Dateinamen erweitert. Dies ist eine Funktion der Shell. Hier wollen Sie eigentlich eine Datei namens * kopieren. Verwenden Sie subprocess.call() mit dem Parameter shell=True.

+1

Interessant ... Aber es funktioniert nicht! –

+0

Richtig! Das war Popen(). Es tut uns leid. –

+0

Glauben Sie nicht, ich könnte einfach verwenden: os.system (‚cp -r ROOT/*/dst‘) Dies scheint zu funktionieren ... –

7

Versuchen

subprocess.call('cp -r ROOT/* /dst', shell=True) 

Beachten Sie die Verwendung einer einzelnen Saite und nicht als hier Array.

Oder bauen Sie Ihre eigene Implementierung mit listdir und copy

+0

Ja, es funktioniert ... Und ich denke, es ist genau das gleiche wie os.system ... Ist das richtig? –

+0

Ich möchte keine Shell verwenden = True, also gibt es einen anderen Weg? – Rahul

+1

@Rahul: Versuchen Sie http://docs.python.org/library/glob.html (und Entschuldigung für die späte Antwort!) –

9

kam gerade über diese beim Versuch, etwas Ähnliches zu tun.

The * will not be expanded to filenames

Genau. Wenn Sie die man-Seite von cp betrachten, können Sie sie mit einer beliebigen Anzahl von Quellargumenten aufrufen, und Sie können die Reihenfolge der Argumente mit dem Schalter -t leicht ändern.

import glob 
import subprocess 
subprocess.call(['cp', '-rt', '/dst'] + glob.glob('ROOT/*')) 
+1

Eigentlich denke ich, das muss etwas wie sein 'subprocess.call (['cp', '-rt', '/ dst'] + glob.glob ('ROOT/*'))' da glob eine Liste zurückgibt –

+0

Guter Punkt, ich werde meinen Kommentar aktualisieren! – chetbox

0

Geben Sie den Befehl als Liste anstelle der Zeichenfolge + Liste ein.

Die folgenden zwei Befehle sind die gleichen: -

First Command:- 
test=subprocess.Popen(['rm','aa','bb']) 

Second command:- 
list1=['rm','aa','bb'] 
test=subprocess.Popen(list1) 

So mehrere Dateien, eine Notwendigkeit, kopieren Sie die Liste der Dateien mit Blob zu bekommen und fügen Sie dann ‚cp‘ an der Vorderseite der Liste und Ziel der Ende der Liste und stellen Sie die Liste subprocess.Popen() zur Verfügung.

wie: -

list1=blob.blob("*.py") 
list1=['cp']+list1+['/home/rahul'] 
xx=subprocess.Popen(list1) 

Es wird die Arbeit machen.