2013-10-04 8 views
2

Je travaille sur un script python qui installe un certificat 802.1x sur une machine Windows 8.1. Ce script fonctionne correctement sur Windows 8 et Windows XP (ne l'ai pas essayé sur d'autres machines).os.listdir ne peut pas voir mon répertoire

J'ai isolé le problème. Il doit faire avec compensation le dossier

"C:\Windows\system32\config\systemprofile\AppData\LocalLow\Microsoft\CryptURLCache\Content" 

Le problème est que j'utilise le système d'exploitation du module et la commande listdir sur ce dossier pour supprimer chaque fichier en elle. Cependant, listdir erreurs, en disant que le dossier n'existe pas, quand il existe en effet.

La question semble être que os.listdir ne peut pas voir le dossier LocalLow. Si je fais un script de deux lignes:

import os 

os.listdir("C:\Windows\System32\config\systemprofile\AppData") 

Il montre le résultat suivant:

['Local', 'Roaming'] 

Comme vous pouvez le voir, LocalLow manque.

Je pense qu'il pourrait être un problème d'autorisations, mais je ne parviens pas à sérieusement déterminer ce une prochaine étape pourrait être. Je cours le processus en tant qu'administrateur à partir de la ligne de commande, et il ne voit tout simplement pas le dossier.

Merci d'avance! Edit: modification de la chaîne en "C: \ Windows \ System32 \ config \ systemprofile \ AppData", "C: \ Windows \ System32 \ config \ systemprofile \ AppData" ou C:/Windows/System32/config/systemprofile/AppData "tous produisent des résultats identiques

Éditer: Une autre ride inhabituelle dans ce problème: Si je crée manuellement un nouveau répertoire dans cet emplacement, je ne peux pas le voir via os.listdir non plus. au LocalLow ou mon nouveau dossier par le « Enregistrer sous .. » commande dans Notepad ++

Je commence à penser que ce bogue dans

aperçu de Windows 8.1.
+2

Vous dites "... quand il existe en effet", mais la preuve que vous montrez semble indiquer que ce n'est pas le cas. Pourquoi pensez-vous que cela existe? – twalberg

+0

Si vous lancez cmd ou powershell et essayez de lister le contenu du répertoire 'AppData', voyez-vous' LocalLow'? Aussi, peut-être que vous faites 'os.walk (directory)' et voyez si vous obtenez les mêmes résultats? –

+0

Oui, à la fois ls et simplement en naviguant dans le dossier laissez-moi le voir très bien. Je peux aussi y accéder à partir d'une invite de cmd. –

Répondre

3

Vous devez avoir des séquences d'échappement sur votre chemin. Vous devez utiliser une chaîne brute pour les chemins fichier/répertoire:

# By putting the 'r' at the start, I make this string a raw string 
# Raw strings do not process escape sequences 
r"C:\path\to\file" 

ou mettre les barres obliques dans l'autre sens:

"C:/path/to/file" 

ou échapper aux barres obliques:

# You probably won't want this method because it makes your paths huge 
# I just listed it because it *does* work 
"C:\\path\\to\\file" 
+1

Une autre option consiste à utiliser deux barres obliques inverses dans le chemin (c'est-à-dire '\\' au lieu de '\') –

+2

@JeffBridgman - Je ne faisais que taper cela lorsque vous avez commenté. :) – iCodez

+0

Merci pour les réponses rapides! Cependant, les trois options produisent exactement les mêmes résultats que mon script original. –

1

Je suis curieux quant à la façon dont vous êtes capable de lister le contenu avec ces deux lignes. Vous utilisez des séquences d'échappement \ W, \ S, \ c, \ s, \ A dans votre code. Essayez d'échapper à la barre oblique inverse comme ceci:

import os 
os.listdir('C:\\Windows\\System32\\config\\systemprofile\\AppData') 
+0

Je ne suis pas sûr exactement pourquoi ceux-ci ne sont pas interprétés comme des séquences d'échappement, mais les trois suggestions faites ci-dessus, ainsi que le code original fonctionnent exactement les mêmes –

2

J'ai récemment rencontré ce problème.

je l'ai trouvé est causé par Windows file system redirector

et vous pouvez consulter ci-dessous l'extrait de python

import ctypes 

class disable_file_system_redirection: 
    _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection 
    _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection 
    def __enter__(self): 
     self.old_value = ctypes.c_long() 
     self.success = self._disable(ctypes.byref(self.old_value)) 
    def __exit__(self, type, value, traceback): 
     if self.success: 
      self._revert(self.old_value) 


#Example usage 
import os 

path = 'C:\\Windows\\System32\\config\\systemprofile\\AppData' 

print os.listdir(path) 
with disable_file_system_redirection(): 
    print os.listdir(path) 
print os.listdir(path) 

ref: http://code.activestate.com/recipes/578035-disable-file-system-redirector/

+0

Hey, merci pour la réponse Cela semble bien, mais malheureusement, je ne suis plus au travail où je travaillais avec Python, donc je ne peux pas confirmer que cela fonctionne.Si quelqu'un d'autre peut le confirmer, je serai heureux de le marquer comme la réponse. –

+0

@JasonBray a fonctionné pour moi, mais si vous utilisez python 3.x + vous avez besoin de 'print (os.listdir (chemin))' au lieu de 'print os.listdir (chemin)' –