2010-01-20 3 views
3

J'essaie de déplacer une commande DOS de mon fichier batch vers Python mais j'obtiens cette erreur. La syntaxe du nom de fichier, du nom de répertoire ou de l'étiquette de volume est incorrecte, pour l'instruction suivante. Si je copie simplement cette commande DOS dans la console de la fenêtre, cela fonctionne. Le fichier os.getcwd() m'a donné le répertoire de travail attendu. Mes questions sont les suivantes: 1. Pourquoi? 2. comment éviter cela? dois-je obtenir le répertoire de travail courant et construire un chemin abstrait pour cette commande? comment faire ça?Pourquoi cette commande DOS ne fonctionne pas dans Python?

grâce

+0

Que voulez-vous dire par "ne fonctionne pas"? Lisez-vous sa sortie du PIPE? –

Répondre

12

\ (backslash) est un caractère d'échappement dans les constantes de chaîne, de sorte que votre chaîne finit par changer. Utilisez doubles \ s (comme si \\) dans les constantes de chaîne:

subprocess.Popen('rd /s /q .\\ProcessControlSimulator\\bin', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
+0

Je suggère également de vérifier la recommandation dans d'autres réponses pour vérifier le module 'os' pour les fonctions de manipulation de fichiers et de répertoires. –

2

Vous ne pouvez pas simplement copier un à un. Par exemple, vos caractères d'échappement() deviennent incorrects. Vous pourriez avoir besoin d'un double \ dans ce cas.

En outre, il y a des appels API spécifiques pour créer et tuer des répertoires, regardez os.path

7

Vous avez unescaped antislashs. Vous pouvez utiliser une chaîne brute de python pour éviter d'avoir à échapper à vos barres obliques, ou les doubler:

subprocess.Popen(r'rd /s /q .\ProcessControlSimulator\bin', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

ou

subprocess.Popen('rd /s /q .\\ProcessControlSimulator\\bin', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
+1

+1 pour la mention des chaînes brutes seules –

9

Mon conseil est d'essayer de ne pas utiliser des commandes système inutilement. Vous utilisez Python, utilisez donc les modules disponibles qui l'accompagnent. D'après ce que je vois, vous essayez de supprimer les répertoires à droite? Ensuite, vous pouvez utiliser des modules comme shutil. Exemple:

import shutil 
import os 
path = os.path.join("c:\\","ProcessControlSimulator","bin") #example only 
try: 
    shutil.rmtree(path) 
except Exception,e: 
    print e 
else: 
    print "removed" 

il y a d'autres aussi, comme os.removedirs, os.remove vous pouvez jeter un oeil à partir de la documentation.

+1

De même, n'attrapez pas l'exception. Laissez-le voler - sauf si vous allez faire quelque chose à ce sujet. – nosklo

Questions connexes