Dans mon répertoire de travail actuel, j'ai la racine directrice / avec certains fichiers à l'intérieur.
Je sais que je peux exécuter Mais si j'ouvre ma console Python et j'écris ceci: p> Il ne fonctionne pas! p> J'ai cette erreur: pouvez-vous m'aider? p> p> CP -R racine / * / dst code> et je n'ai aucun problème. P>
CP: impossible Stat racine / *: Aucun fichier ou répertoire de ce type code> p>
4 Réponses :
Le * code> ne sera pas étendu aux noms de fichiers. Ceci est une fonction de la coquille. Ici, vous voulez réellement copier un fichier nommé *. Utilisez
sous-processus.Call () code> avec le paramètre
shell = true code>. P>
Droit! C'était popen (). Désolé.
Ne pensez-vous pas que je puisse simplement utiliser: os.system ('CP -R root / * / dst') Cela semble fonctionner ...
Peut-être que vous pouvez utiliser le module Glob pour créer la liste des fichiers que vous souhaitez copier et transmettre les noms de fichiers en sous-processus.Call ().
OS.System () exécute en fait la commande via un sous-groupe. L'expansion du nom de fichier est ensuite effectuée par la coquille.
Vieille question mais très utile pour une erreur similaire sur Windows. La même limitation s'applique - "*. *" Ne se développe que si vous définissez coquille = true.
ESSAYEZ
subprocess.call('cp -r ROOT/* /dst', shell=True)
Oui, ça marche ... Et je pense que c'est exactement la même chose que OS.System ... est-ce raison?
Je ne veux pas utiliser Shell = TRUE, alors y a-t-il d'autre manière?
@Rahul: essayez docs.python.org/library/glob.html (et désolé pour la réponse tardive!)
Je viens de tomber en face en essayant de faire quelque chose de similaire.
Le * ne sera pas étendu aux noms de fichiers p> BlockQuote>
Exactement. Si vous regardez la page man > CP code> Vous pouvez l'appeler avec n'importe quel nombre d'arguments de source et vous pouvez facilement modifier l'ordre des arguments avec le commutateur
-t code>. < / p>
xxx pré> p>
En fait, je pense que cela doit être quelque chose comme sous-processus.Call (['cp', '-rt', '/ dst'] + glob.glob ('root / *')) code> depuis Glob renvoie une liste.
Fournissez la commande en tant que liste au lieu de la chaîne + la liste.
Les deux commandes suivantes sont identiques: - p> pour copier plusieurs fichiers, il faut Obtenez la liste des fichiers à l'aide de BLOB, puis ajoutez «CP» à l'avant de la liste et de la destination à la fin de la liste et fournissez la liste à sous-processus.Popen (). P> J'aime: - P> Il fera le travail. p> p>
Pour cet exemple, vous devriez probablement simplement utiliser
shutl.copytree code >
, qui fait exactement que (Copie de répertoires récursif).