2016-04-18 9 views
0

Ich habe Probleme mit os.walk() in Python 2.7.8 unter Windows.os.walk() verarbeitet keine Unterverzeichnisse bei Verwendung von UNC-Pfaden

Wenn ich es mit einem "normalen" Pfad wie "D:\Test\master" liefern, funktioniert es wie erwartet. Wenn ich es jedoch mit einem UNC-Pfad wie "\\?\D:\Test\master" versehe, wird es das Stammverzeichnis wie erwartet melden, aber es wird nicht in die Unterverzeichnisse gedrillt, noch löst es eine Ausnahme aus.

Meine Forschung: Ich las auf help page, dass os.walk() ein Funktionsargument akzeptiert, um Fehler zu behandeln. Standardmäßig ist dieses Argument None, daher wird kein Fehler gemeldet.

Ich habe eine einfache Funktion übergeben, um den Fehler zu drucken und erhielt für jedes Verzeichnis Folgendes.

def WalkError(Error): 
    raise Exception(Error) 

Stapelüberwachung:

Traceback (most recent call last): 
    File "Compare.py", line 988, in StartServer 
    for root, dirs, files in os.walk(ROOT_DIR,True,WalkError): 
    File "C:\Program Files (x86)\Python2.7.8\lib\os.py", line 296, in walk 
    for x in walk(new_path, topdown, onerror, followlinks): 
    File "C:\Program Files (x86)\Python2.7.8\lib\os.py", line 281, in walk 
    onerror(err) 
    File "Compare.py", line 62, in WalkError 
    raise Exception(Error) 
Exception: [Error 123] The filename, directory name, or volume label syntax is incorrect: '\\\\?\\D:\\Test\\master\\localization/*.*' 
+3

Sie tatsächlich eine Antwort auf Ihre eigene Frage veröffentlichen können. http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ – Arthur2e5

+0

Das '' \\? \ '' Präfix ist kein UNC-Pfad. Ein UNC-Pfad wie '\\ server \ share \ wird zu \\? \ UNC \ server \ share mit dem erweiterten Pfadpräfix. Dieses '' \\? \ "' Präfix umgeht die normale Pfadverarbeitung. Windows ersetzt es einfach durch das NT-DOS-Geräte-Präfix '' \ ?? \ '', bei dem der Objektmanager nach dem Gerät in den DOS-Geräten der Anmeldesitzung und dann nach dem Objektverzeichnis \ Global \ sucht. Das bedeutet, dass ein '' \\? \ '' - Pfad eine Unicode-Zeichenfolge sein muss, da NT-Pfade Unicode sind und nur den umgekehrten Schrägstrich als Pfadtrennzeichen verwenden müssen, da ein Schrägstrich nur ein normales Namenszeichen im NT-Namespace ist. – eryksun

+0

Wenn Sie ''//?/D:/Test/master' verwenden, wird die normale Pfadverarbeitung nicht umgangen, und der Pfad ist auf' MAX_PATH' (260) begrenzt. Verwende 'u '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ – eryksun

Antwort

0

Antwort vom ursprünglichen Autor (ursprünglich als Bearbeitung auf die Frage gepostet):

Instant-Update: Im Prozess \lib\os.py der Inspektion, entdecken ich die Der Fehler stammt von os.listdir(). Ich suchte nach der obigen Fehlermeldung in Bezug auf os.listdir() und fand this solution, die für mich funktionierte.

Es sieht so aus, als ob Sie UNC-Stilpfade mit os. Modulen verwenden werden, die sie zu Unixized benötigen (haben Sie ihre \ konvertiert zu /). \\\\?\\D:\\Test\\master\\ wird //?/D:/Test/master/ (Hinweis: Sie müssen nicht mehr die \ entgehen, die praktisch ist).

Dies läuft gegen die UNC 'spec', also seien Sie sich bewusst, wenn Sie mit anderen Modulen arbeiten, die Microsofts UNC-Implementierung respektieren.

(Sorry für die Selbst Lösung, würde ich auf die Registerkarte schließen, aber fühlte es gab hier Wissen, die nicht an anderer Stelle gefunden werden konnte.)

+0

Kein solches Problem existiert für UNC-Pfade, und das '' \\? \ '' Präfix ist nicht einmal ein UNC-Pfad. Sie können Slash nicht als Pfadtrennzeichen in einem NT-Pfad verwenden, den Python verletzt, indem er '/*.*' im 8-Bit-Zweig' str' anhängt. Wenn Sie '\ *. *' Hinzufügen, können Sie '' \\?\\ "in einem Pfad, der keine Unicode-Zeichenfolge ist, aber es ist nur dokumentiert, dass bis zu 260 Zeichen zulässig sind, da ältere Windows-Versionen 8-Bit-ANSI-Zeichenfolgen für einen statisch zugewiesenen Puffer dekodieren, der diese Begrenzung festlegt. Wie auch immer, der 8-Bit-String-Zweig von Pythons "listdir" verwendet einen Stack-reservierten Puffer, der ebenfalls auf 260 Zeichen begrenzt ist. – eryksun

+0

@eryksun Ich bearbeite diese Antwort nicht, ich nehme das nicht zur Kenntnis, ich habe das nicht geschrieben. Es wurde in der Überprüfungswarteschlange zum Löschen markiert, und es schien dem OP geholfen zu haben, so dass ich es nur gerettet habe. Fühlen Sie sich frei, es zu bearbeiten, oder noch besser - posten Sie Ihre eigene Antwort. Wenn Sie dies tun, benachrichtigen Sie mich bitte, damit ich dieses löschen kann. Vielen Dank! :) – vacip

+0

Ich habe ähnliche Antworten [hier] (http://stackoverflow.com/a/36237176/205580) und [hier] (http://Stackoverflow.com/a/24064783/205580). Ich könnte eine weitere Antwort hinzufügen, um zu diskutieren, '' \\? \ '' Mit 'listdir' in Python 2 zu verwenden, aber Probleme treten nur auf, wenn Sie versuchen, es mit einem 8-bit' str' Pfad zu verwenden, der gerade veraltet sein sollte in 2.7, genau wie "Bytes" Pfade sind für Windows in Python 3 veraltet. – eryksun

Verwandte Themen