2009-09-08 7 views
11

En mi directorio de trabajo actual tengo el directorio ROOT/con algunos archivos dentro.Problema con subprocess.call

Sé que puedo ejecutar cp -r ROOT/* /dst y no tengo ningún problema.

Pero si abro la consola de Python y escribo esto:

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

No funciona!

que tienen este error: cp: cannot stat ROOT/*: No such file or directory

¿Me puede ayudar?

+1

Para este ejemplo, probablemente solo deba usar ['shutil.copytree'] (http://docs.python.org/library/shutil.html#shutil.copytree), que hace exactamente eso (copia recursiva de directorios) . – naught101

Respuesta

4

El * no se ampliará a los nombres de archivo. Esta es una función del caparazón. Aquí realmente quiere copiar un archivo llamado *. Use subprocess.call() con el parámetro shell=True.

+1

Interesante ... ¡Pero no funciona! –

+0

¡Correcto! Ese fue Popen(). Lo siento. –

+0

¿No cree que podría utilizar simplemente: os.system ('cp -r ROOT/*/DST') Esto parece funcionar ... –

7

Trate

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

Nota el uso de una sola cadena en lugar de una matriz aquí.

O construir su propia aplicación con listdir y copy

+0

Sí, funciona ... Y creo que es exactamente lo mismo que os.system ... ¿Es correcto? –

+0

No quiero usar shell = Verdadero, ¿hay alguna otra manera? – Rahul

+1

@Rahul: Prueba http://docs.python.org/library/glob.html (¡y perdón por la respuesta tardía!) –

9

encontré con esto mientras tratando de hacer algo similar.

The * will not be expanded to filenames

Exactamente. Si mira en la página de manual de cp puede llamarlo con cualquier cantidad de argumentos de origen y puede cambiar fácilmente el orden de los argumentos con el modificador -t.

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

En realidad, creo que esto tiene que ser algo así como 'subprocess.call (['cp', '-rt', '/ dst'] + glob.glob ('ROOT/*'))' porque glob devuelve una lista. –

+0

¡Buen punto! ¡Actualizaré mi comentario! – chetbox

0

Proporcione el comando como una lista en lugar de la lista de cadenas +.

Los siguientes dos comandos son los mismos: -

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

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

Así que para copiar varios archivos, una necesidad de obtener la lista de archivos a través de burbuja y luego añadir 'cp' al frente de la lista y destino a la fin de lista y proporcione la lista para subprocesar.Popen().

Al igual que: -

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

que va a hacer el trabajo.