11
votes

Problème avec subprocess.call

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 CP -R racine / * / dst et je n'ai aucun problème.

Mais si j'ouvre ma console Python et j'écris ceci: xxx

Il ne fonctionne pas!

J'ai cette erreur: CP: impossible Stat racine / *: Aucun fichier ou répertoire de ce type

pouvez-vous m'aider?


1 commentaires

Pour cet exemple, vous devriez probablement simplement utiliser shutl.copytree , qui fait exactement que (Copie de répertoires récursif).


4 Réponses :


4
votes

Le * 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 () avec le paramètre shell = true .


5 commentaires

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.



7
votes

ESSAYEZ

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


3 commentaires

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!)



10
votes

Je viens de tomber en face en essayant de faire quelque chose de similaire.

Le * ne sera pas étendu aux noms de fichiers

Exactement. Si vous regardez la page man CP 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 . < / p> xxx


1 commentaires

En fait, je pense que cela doit être quelque chose comme sous-processus.Call (['cp', '-rt', '/ dst'] + glob.glob ('root / *')) depuis Glob renvoie une liste.



0
votes

Fournissez la commande en tant que liste au lieu de la chaîne + la liste.

Les deux commandes suivantes sont identiques: - xxx

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 ().

J'aime: - xxx

Il fera le travail.


0 commentaires