2009-09-08 2 views
11

Nella mia attuale directory di lavoro ho la dir ROOT/con alcuni file all'interno.Problema con subprocess.call

So che posso eseguire cp -r ROOT/* /dst e non ho problemi.

Ma se apro la mia console Python e scrivo questo:

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

Non funziona!

ho questo errore: cp: cannot stat ROOT/*: No such file or directory

mi potete aiutare?

+1

Per questo esempio, dovresti probabilmente usare solo '' shutil.copytree'] (http://docs.python.org/library/shutil.html#shutil.copytree), che fa esattamente questo (copia ricorsiva di directory) . – naught101

risposta

4

Lo * non sarà esteso ai nomi di file. Questa è una funzione della shell. Qui in realtà vuoi copiare un file di nome *. Utilizzare subprocess.call() con il parametro shell=True.

+1

Interessante ... Ma non funziona! –

+0

Giusto! Quello era Popen(). Scusate. –

+0

Non pensi che potrei utilizzare semplicemente: os.system ('cp -r ROOT/*/DST') Questo sembra funzionare ... –

7

Prova

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

Nota l'uso di una singola stringa piuttosto che una matrice qui.

o creare una propria implementazione con listdir e copy

+0

Sì, funziona ... E penso che sia esattamente lo stesso di os.system ... È vero? –

+0

Non voglio usare shell = Vero, quindi c'è un altro modo? – Rahul

+1

@Rahul: prova http://docs.python.org/library/glob.html (e scusami per la risposta tardiva!) –

9

Proprio imbattuto in questo durante il tentativo di fare qualcosa di simile.

The * will not be expanded to filenames

Esattamente. Se guardi la pagina man di cp puoi chiamarla con qualsiasi numero di argomenti sorgente e puoi facilmente cambiare l'ordine degli argomenti con lo switch -t.

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

In realtà, penso che questo debba essere qualcosa come 'subprocess.call (['cp', '-rt', '/ dst'] + glob.glob ('ROOT/*'))' poiché glob restituisce una lista –

+0

Buon punto! Aggiornerò il mio commento! – chetbox

0

Fornire il comando come lista invece della stringa + lista.

I due comandi seguenti sono gli stessi: -

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

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

Quindi, per copiare più file, una necessità di ottenere l'elenco dei file utilizzando blob e quindi aggiungere 'cp' alla parte anteriore della lista e destinazione al fine dell'elenco e fornire l'elenco al sottoprocesso.Popen().

piace: -

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

che farà il lavoro.