Ich schreibe ein Python-Skript, das Dateipfade als Zeichenfolgen akzeptiert, analysiert sie, hängt einen Befehlsnamen an und erstellt eine Liste, die zur Ausführung an subprocess.Popen()
übergeben wird. Dieses Skript behandelt sowohl Unix- als auch Windows-Dateipfade und sollte letztendlich auf beiden Systemen ausgeführt werden.Wie verhindert man das automatische Entkommen von Sonderzeichen in Python
Wenn ich dies unter Unix ausführen, wenn ich einen Windows-Pfad geben, der versehentlich ein Escape-Zeichen enthält (z. B. \Users\Administrator\bin
), interpretiert Python die eingebettete \b
als Backspace-Zeichen. Ich möchte das verhindern.
Soweit ich weiß, gibt es keine Funktion oder Methode, um eine String-Variable als eine rohe Zeichenfolge zu bezeichnen. Der Modifikator 'r'
funktioniert nur für Zeichenfolgenkonstanten.
Bisher ist die nächste, die ich habe in der Lage gewesen, dies zu erhalten:
winpath = "C:\Users\Administrator\bin"
winpath = winpath.replace('\b','\\b')
winpathlist = winpath.split('\\')
An dieser Stelle sollte winpathlist ['C:','Users','Administrator','bin']
enthält, nicht ['C','Users','Administrator\x08in']
.
kann ich keine weiteren Anrufe winpath.replace()
fügen Sie die anderen Fluchten zu behandeln ich bekommen könnte - \a
, \f
, \n
, \r
, \t
, \v
- aber nicht \x
.
Gibt es einen mehr pythischen Weg, dies zu tun?
Wie erhalten Sie den Wert in die Zeichenfolge? Python sollte das \ b nicht als Escape behandeln, es sei denn, es befindet sich in einem Zeichenfolgenliteral, oder es wird zunächst als Escape in die Zeichenfolge eingefügt. (Auch Schrägstriche funktionieren gut.) – geoffspear
@Wooble: Im Moment kommt es über Doctest. >>> myCommandObject.setExcecutablePath ('C: \ Programme \ cygwin \ cdrive \ bin') Dabei enthält myCommandObject einen Befehlsnamen (z. B. 'ps'), einen Pfad und eine Liste mit Argumenten. Das Ändern der Schrägstriche von umgekehrten Schrägstrichen in Schrägstriche ist keine Option; Mein Kunde hat ausdrücklich erklärt, dass dies das ist, was er wollte. – poltr1
Wie gesagt, r funktioniert nur für String-Literale; Es funktioniert nicht für String-Variablen. Ich betrachte das führende r als Kluge. Wie auch immer, hier ist der doctest (oder einen Teil davon): >>> myCommand.setExecutablePath ('C: \ Programme \ cygwin \ cdrive \ bin') >>> myCommandList = myCommand.getLaunchList() >> > myCommandList ['C: \\\\ Programme \\\\ cygwin \\\\ cdrive \\\\\\\\\\\\\\ ps', '-e', '-f'] >>> myCommandList [0] .split ("\\\\") ['C:', 'Programme', 'cygwin', 'cdrive', 'bin', 'ps'] Ich bekomme keine mehr Fehler, jetzt, da ich den Aufruf zum Ersetzen hinzugefügt habe. – poltr1