2009-10-27 5 views
9

Können alle Pfade in einem Python-Programm ".." (für das übergeordnete Verzeichnis) und/(zum Trennen von Pfadkomponenten) verwenden und funktionieren unabhängig von der Plattform?Unix-Pfade: offiziell in Python für jede Plattform arbeiten?

Auf der einen Seite habe ich noch nie einen solchen Anspruch in der Dokumentation gesehen (ich habe ihn vielleicht verpasst), und die Module os und os.path bieten Möglichkeiten zur plattformunabhängigen Behandlung von Pfaden (os.pardir, os.path.join, ...), was mich denken lässt, dass sie aus einem bestimmten Grund hier sind.

Auf der anderen Seite können Sie read on StackOverflow, dass "../path/to/file" auf allen Plattformen funktioniert ...

So sollten os.pardir, os.path.join und Freunde immer dann verwendet werden, Aus Gründen der Portabilität, oder sind Unix-Pfadnamen immer sicher (bis zu möglichen Zeichencodierungsproblemen)? oder vielleicht "fast immer" sicher (d. h. unter Windows, OS X und Linux arbeiten)?

+4

hatte nie ein Problem mit/auf Windows. – jldupont

Antwort

6

"Fast immer sicher" ist richtig. Alle Plattformen, die Ihnen wichtig sind, funktionieren wahrscheinlich heute gut und ich denke nicht, dass sie ihre Konventionen bald ändern werden.

Allerdings ist Python sehr portabel und läuft auf viel mehr als die üblichen Plattformen. Der Grund für das Modul os ist es, die Dinge darüber zu glätten, dass eine Plattform andere Anforderungen hat.

Gibt es einen guten Grund für Sie, die os Funktionen nicht zu verwenden?

os.pardir ist selbstdokumentiere während ".." nicht, und os.pardir könnte einfacher sein, für

Hier grep sind einige Dokumente aus Python 1.6, wenn Mac für alles

OS-Routinen noch anders war für Mac, DOS, NT oder Posix je nachdem, welches System wir haben an.

Dies exportiert: - alle Funktionen von Posix, Nt, DOS, OS2, Mac oder CE, z. unlink, stat, etc. - os.path ist eines der Module posixpath, ntpath, macpath oder dospath - os.name ist 'posix', 'nt', 'dos', 'os2', 'mac', oder 'ce' - os.curdir ist eine Zeichenfolge, die das aktuelle Verzeichnis ('.' oder ':') darstellt. - os.pardir ist eine Zeichenfolge, die das übergeordnete Verzeichnis darstellt ('..' oder '::') - os.sep ist das Trennzeichen für den Pfadnamen ('/' oder ':' oder '\') - os.altsep ist der Trennzeichen für den alternativen Pfadnamen (None oder '/') - os.pathsep ist der Komponente Separator in $ PATH etc verwendet - os.linesep ist die Linie Separator in Textdateien (' 'oder' 'oder'') - os.defpath ist der Standard-Suchpfad für ausführbare Dateien

Programme, die 'os' importieren und verwenden, haben eine bessere Chance portabel zwischen verschiedenen Plattformen zu sein. Natürlich müssen sie dann nur Funktionen verwenden, die durch alle Plattformen definiert sind (z. B. unlink und opendir), und alle Pfadnamenmanipulationen an os.path belassen (z., splitten Sie und verbinden Sie).

+0

Der Grund, warum ich daran dachte, os.path und co zu umgehen. ist, dass es einfacher und ziemlich klar ist, "../dir1/dir2/dir3/file" anstatt os.path.join (os.pardir, ['dir1', 'dir2', 'dir3', 'Datei '])! – EOL

+0

@EOL Ich kann nicht an zu viele echte Programme denken, die das brauchen. Vielleicht macht es Sinn, einen solchen Pfad in eine Konfigurationsdatei zu verschieben. –

+0

@gnibbler Meine Programme analysieren Tausende von Datensätzen und speichern Ergebnisse an konventionellen Speicherorten, wobei Verzeichnisnamen aus dem "Namen" jedes Datensatzes berechnet werden. Aber ja, os.path.join (os.pardir, ...) ist fast so kurz wie die direkte Pfadkodierung. – EOL

1

OS/X und Linux sind beide Unix-kompatibel, daher verwenden sie per Definition das Format, das Sie am Anfang der Frage angegeben haben. Windows erlaubt "/" zusätzlich zu "\", so dass Programme mit Xenix, einer Unix-Variante, die Microsoft vor langer Zeit ausprobierte, austauschbar sein könnten, und dass die Kompatibilität in die Gegenwart übertragen wurde. So funktioniert es auch.

Ich weiß nicht, auf wie viele andere Plattformen Python portiert wurde, und ich kann nicht für sie sprechen.

3

Innerhalb von Python wird die Verwendung von / immer funktionieren. Sie werden sich der OS-Konvention sein müssen, wenn Sie einen Befehl in einer Subshell

myprog = "/path/to/my/program" 
os.system([myprog, "-n"])       # 1 
os.system([myprog, "C:/input/file/to/myprog"])  # 2 

Kommando # 1 wird wahrscheinlich wie erwartet ausgeführt werden soll.
Befehl # 2 funktioniert möglicherweise nicht, wenn myprog ein Windows-Befehl ist und erwartet, seine Befehlszeilenargumente zu analysieren, um einen Windows-Dateinamen zu erhalten.

+1

nur eine Randnotiz - niemals 'os.system' verwenden, um Programme auszuführen. Es nimmt eine Zeichenkette (keine Liste wie Sie verwendet) und ruft unnötigerweise eine Shell auf. Verwenden Sie stattdessen das Modul 'subprocess'. – nosklo

3

Windows unterstützt / als Pfadtrennzeichen. Die einzigen Inkompatibilitäten zwischen Unix-Dateinamen und Windows-Dateinamen sind:

  • die erlaubten Zeichen in Dateinamen
  • die speziellen Namen und
  • Fall Empfindlichkeit

Windows is more restrictive in the first two accounts (dies ist, ist es verboten Zeichen hat und andere spezielle Namen), während Unix normalerweise Groß- und Kleinschreibung unterscheidet. Es gibt einige answers hier Auflistung genau was sind diese Zeichen und Namen. Ich werde sehen, ob ich sie finden kann.

Jetzt, wenn Ihre Entwicklungsumgebung mit einer Funktion zum Erstellen oder Bearbeiten von Pfaden kommt, sollten Sie es verwenden, es ist aus einem bestimmten Grund, weißt du. Vor allem, da es viel mehr Plattformen als Windows und Unix gibt.

Beantworten Sie Ihre erste Frage, ja ../dir/file wird funktionieren, es sei denn, sie treffen einige der oben genannten Inkompatibilitäten.

+0

Vergessen Sie nicht den Unterschied zwischen Groß- und Kleinschreibung. –

11

Ich hatte nie Probleme mit der Verwendung von .., obwohl es eine gute Idee sein könnte, es in einen absoluten Pfad mit os.path.abspath zu konvertieren. Zweitens würde ich empfehlen, immer os.path.join zu verwenden, wo immer es möglich ist.Es gibt viele Eckfälle (abgesehen von Portabilitätsproblemen) beim Verbinden von Pfaden, und es ist gut, sich nicht um sie kümmern zu müssen. Zum Beispiel:

>>> '/foo/bar/' + 'qux' 
'/foo/bar/qux' 
>>> '/foo/bar' + 'qux' 
'/foo/barqux' 
>>> from os.path import join 
>>> join('/foo/bar/', 'qux') 
'/foo/bar/qux' 
>>> join('/foo/bar', 'qux') 
'/foo/bar/qux' 

können Sie Probleme bei der Verwendung von .., wenn Sie auf einigen obskuren Plattformen sind, aber ich kann nicht nennen jedes (Windows, * nichts, und O X alle unterstützen, dass Notation).

3

Es funktioniert auf Windows, also wenn Sie "was auch immer die Plattform" zu Unix und Windows definieren, geht es Ihnen gut.

Auf der anderen Seite läuft Python auch auf VMS, RISC OS und anderen ungeraden Plattformen, die völlig andere Dateinamenkonventionen verwenden. Es ist jedoch wahrscheinlich, dass der Versuch, Ihre Anwendung auf VMS laufen zu lassen, blind ist, irgendwie albern ist - "vorzeitige Portabilität ist die Wurzel von einigen relativ kleinen Bösen"

Ich mag die os.path-Funktionen sowieso, weil sie sind gut für den Ausdruck von Absicht - anstatt nur eine String-Verkettung, die für eine von einer Million Zwecke durchgeführt werden kann, liest es sich sehr explizit als eine Pfadmanipulation.

0

Wie andere schon gesagt haben, funktioniert ein Schrägstrich in allen Fällen, aber Sie erstellen besser eine Liste von Pfadsegmenten und os.path.join().

Verwandte Themen