2013-07-26 20 views
7

Stavo cercando di utilizzare il sottoprocesso chiamate a eseguire un'operazione di copia (codice qui sotto):Python sottoprocesso Errore nel usando "cp"

import subprocess 
pr1 = subprocess.call(['cp','-r','./testdir1/*','./testdir2/'], shell = True) 

ed ho ottenuto un errore che dice:

cp: missing file operand 

Try `cp --help' for more information. 

Quando provo con shell=False, ottengo

cp: cannot stat `./testdir1/*': No such file or directory 

Come faccio a risolvere questo problema?

sto usando RedHat Linux GNOME Deskop versione 2.16.0 e shell bash e Python 2.6

P.S. Ho letto la domanda ha postato in Problems with issuing cp command with Popen in Python, ed è suggerito di utilizzare shell = True opzione, che non funziona per me, come ho già detto :(

risposta

12

Quando si utilizza shell=True, passare una stringa, non una lista di subprocess.call:

subprocess.call('cp -r ./testdir1/* ./testdir2/', shell=True) 

The docs say:..

In Unix con shell = true, le impostazioni predefinite di shell da/bin/sh Se args è una stringa , la stringa specifica il comando da eseguire attraverso il guscio Ciò significa che la stringa deve essere formattata esattamente come sarebbe quando viene digitata al prompt della shell. Ciò include, ad esempio, la citazione o il nome di file di escape di backslash con spazi vuoti al loro interno o . Se args è una sequenza , il primo elemento specifica la stringa di comando e tutti gli elementi aggiuntivi verranno trattati come argomenti aggiuntivi per la shell stessa.

So (su Unix), quando una lista viene passato subprocess.Popen (o subprocess.call), il primo elemento della lista viene interpretato come il comando, tutti gli altri elementi della lista vengono interpretati come argomenti per il shell. Dal momento che nel tuo caso non hai bisogno di passare argomenti alla shell, puoi semplicemente passare una stringa come primo argomento.

2

Questo è un thread vecchio ora, ma stavo solo avendo lo stesso problema.

Il problema si stavano avendo con questo invito:

subprocess.call(['cp','-r','./testdir1/*','./testdir2/'], shell = False) 

era che ciascuno dei parametri dopo il primo sono quotati. Quindi, per la shell vede il comando come questo:

cp '-r' './testdir1/*' './testdir2/' 

Il problema con questo è il carattere jolly (*). Il filesystem cerca un file con il nome letterale '*' nella directory testdir1, che ovviamente non è presente.

La soluzione è effettuare la chiamata come la risposta selezionata utilizzando l'opzione shell = True e nessuno dei parametri indicati.

+0

Buona spiegazione. Mi ha aiutato a capire cosa stava succedendo. – morganw09dev

Problemi correlati