L'appel de rm de sous-processus à l'aide de caractères génériques ne supprime pas les fichiers
Je suis en train de construire une fonction qui permet de supprimer tous les fichiers qui commencent par "ajouter" de la racine de mon projet. Voici ce que j'ai jusqu'à présent
def cleanup(prepend):
prepend = str(prepend)
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
end = "%s*" % prepend
cmd = 'rm'
args = "%s/%s" % (PROJECT_ROOT, end)
print "full cmd = %s %s" %(cmd, args)
try:
p = Popen([cmd, args], stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True).communicate()[0]
print "p", p
except Exception as e:
print str(e)
Je ne suis pas avoir un peu de chance, il ne semble pas faire quoi que ce soit. Avez-vous des idées de ce que je fais de mal? Merci!!!!
Je pense que Levon réponse est la meilleure approche; cela dit, si vous voulez voir ce qui est en train de faire, exécutez cette sous
strace(1)
avec -f
option de ligne de commande et vous pouvez voir exactement la execve(2)
appel système qui est en train d'être fait.OriginalL'auteur mythander889 | 2012-06-14
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous êtes de passage à deux arguments de
subprocess.Popen
:rm
et un chemin d'accès, tels que/home/user/t*
(si le préfixe estt
).Popen
alors essayez de supprimer un fichier nommé exactement de cette manière: t suivi par un astérisque à la fin.Si vous souhaitez utiliser
Popen
avec le générique, vous devriez passer l'shell
paramètre commeTrue
. Dans ce cas, cependant, la commande doit être une chaîne de caractères, et non une liste d'arguments:(Sinon, la liste des arguments sera donné à la nouvelle coque, pas à la commande)
Une autre solution, plus sûr et plus efficace, est d'utiliser le
glob
module:Dans l'ensemble, cependant, je suis d'accord que levon solution est la plus saine. Dans ce cas,
glob
la réponse, c'est trop:OriginalL'auteur brandizzi
Envisagez-vous de cette approche à l'aide de os.remove() à la suppression de fichiers au lieu de
rm
:Mise à jour (en gros déplacement de mon commentaire d'en dessous dans ma réponse):
Comme
os.remove()
ne peut pas gérer des caractères génériques sur son propre, en utilisant les glob module pour aider donnera une solution, comme on le répète mot pour mot ce DONC réponse:os.remove()
par lui-même ne peut pas gérer les caractères génériques, cette réponse montre un peu de code à l'aide deos.remove()
avec leglob
module pour faire juste cela: stackoverflow.com/a/5532521/1209279 .. d'autres approches sont également indiqués.Non, les jokers sont évaluées par le shell, et les meilleures façons de le faire (à partir d'un point de vue sécurité) n'ont pas de coquille impliqués.
import glob, os; for filename in glob.glob('*.txt'): os.remove(filename)
OriginalL'auteur Levon
Je voudrais essayer quelque chose comme ceci (qui fonctionne aussi sur Windows, mais je suppose que c'est pas une préoccupation pour vous:
OriginalL'auteur Jack Leow