Appeler ‘mv’ de Python Popen avec un joker

Je ne peux pas sembler obtenir la commande «mv» pour travailler à partir de subprocess.Popen Python. subprocess.Popen avec un caractère générique.

Le code:

 def moveFilesByType(source, destination, extension): params = [] params.append("mv") params.append(source + "/*." + extension) params.append(destination + "/") print params pipe = subprocess.Popen(params, shell=True, stdout=PIPE) result, err = pipe.communicate() return result 

La sortie des print params :

  ['mv', '/full_path_to_folder_source/*.nib', '/full_path_to_folder_target/'] 

Les chemins ici sont raccourcis juste pour la lisibilité, mais je vous assure qu’ils sont valables. L’appel de cette même commande à partir d’un terminal fonctionne mais l’appel à python donne le message standard sur l’utilisation incorrecte de mv :

 usage: mv [-f | -i | -n] [-v] source target mv [-f | -i | -n] [-v] source ... directory 

J’ai lu que pour que les caractères génériques fonctionnent, j’aurais besoin du paramètre shell=True dans l’appel Popen , qui est présent. Des idées pourquoi cela ne fonctionne pas? Supprimer le shell=True finit par traiter les astérisques comme des littéraux durs comme prévu.

Utilisez une chaîne au lieu d’un tableau:

 params = "mv /full_path_to_folder_source/*.nib /full_path_to_folder_target/" 

Lorsque vous spécifiez des arguments via la forme de tableau, l’argument '/full_path_to_folder_source/*.nib' est transmis à mv . Vous voulez forcer bash à développer l’argument, mais Popen ne transmettra pas chaque argument à travers le shell.

Vous pouvez le faire sans lancer un nouveau processus en utilisant les modules shutil et glob:

 import glob import shutil def moveFilesByType(source, destination, extension): for path in glob.glob(source + "/*." + extension): shutil.move(path, destination) 

Vous ne devriez pas avoir besoin d’utiliser un sous-processus pour cela, consultez shutil.copytree