Frage

Können alle Pfade in einem Python-Programm verwenden „..“ (für das übergeordnete Verzeichnis) und / (zur Trennung von Pfadkomponenten) und arbeiten noch unabhängig von der Plattform

Auf der einen Seite habe ich noch nie einen solchen Anspruch in der Dokumentation zu sehen (ich es verpasst haben) und die OS und os.path Module Einrichtungen liefern für Pfade in einem plattformunabhängig Weg Handling (os.pardir, os .path.join, ...), die lässt mich denken, dass sie aus einem Grund hier sind.

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

So sollte os.pardir, os.path.join und Freunde immer dann verwendet werden, für die Portabilität Zwecke oder Unix sind Pfadnamen immer sicher (bis zu möglichen Zeichencodierung Probleme)? oder vielleicht "fast immer" sicher (das heißt das Arbeiten unter Windows, OS X und Linux)?

War es hilfreich?

Lösung

„Fast immer sicher“ ist richtig. heute alle Plattformen arbeiten Sie kümmern sich um wahrscheinlich in Ordnung, und ich glaube nicht, dass sie bald ihre Konventionen jeder Zeit zu ändern.

Allerdings Python ist sehr portabel und läuft auf viel mehr als die üblichen Plattformen. Der Grund für die os Modul ist glatt Dinge über sie eine Plattform hat unterschiedliche Anforderungen zu helfen.

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

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

grep

Hier finden Sie einige Dokumente aus Python 1.6, wenn Mac für alles noch anders war

  

OS-Routinen für Mac, DOS, NT oder Posix je nachdem, welche System wir sind   auf.

     

Diese Exporte:     - alle Funktionen von POSIX, NT, DOS, OS2, Mac oder CE, z.B. unlink, stat, usw.     - 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 ‚:‘ ‚‘)     - os.pardir ist eine Zeichenfolge, die das übergeordnete Verzeichnis ( ‚..‘ oder ‚::‘)     - os.sep ist (oder ein am häufigsten) Pfadnamen Separator ( '/' oder ':' oder '\')     - os.altsep ist die alternative Pfadtrenn (Keine oder ‚/‘)     - os.pathsep ist die Komponente Separator in $ PATH verwendet usw.     - os.linesep ist die Linientrenner in Textdateien ( ‚‚oder‘‚oder‘‘)     - os.defpath ist der Standard-Suchpfad für ausführbare Dateien

     

Programme, die importieren und verwenden ‚os‘ eine bessere Chance des Seins   portabel zwischen verschiedenen Plattformen. Natürlich müssen sie dann nur   Verwendung von Funktionen, die alle Plattformen definiert sind (beispielsweise entkoppeln und   opendir), und lassen Sie alle Pfadmanipulation os.path (zum Beispiel Split   und kommt).

Andere Tipps

Ich hatte noch nie irgendwelche Probleme mit .. verwenden, obwohl es eine gute Idee sein, könnte es zu einem absoluten Pfad zu konvertieren mit os.path.abspath . Zweitens würde ich empfehlen, immer wo auch immer möglich, mit os.path.join. Es gibt eine Menge von Fällen Ecke (abgesehen von Portabilitätsproblemen) Wege in Verbindung, und es ist gut, nicht zu haben, um sie zu kümmern. 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'

Sie können bei der Verwendung von .. auf Probleme stoßen, wenn Sie auf einigen obskuren Plattformen sind, aber ich kann nicht jeden beliebigen Namen (Windows, * nix, und OS X alle unterstützen, dass Notation).

In Python, / verwendet, wird immer funktionieren. Sie werden sich der OS-Konvention sein müssen, wenn Sie einen Befehl in einer Subshell ausgeführt werden soll

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

Befehl # 1 wird wahrscheinlich wie erwartet.
Befehl # 2 möglicherweise nicht, wenn myprog ein Befehl Windows ist und erwartet, dass seine Befehlszeilenargumente analysieren einen Windows-Datei-Namen zu erhalten.

Es funktioniert unter Windows, wenn Sie also definieren „was auch immer die Plattform“ Unix und Windows zu sein, du bist in Ordnung.

Auf der anderen Seite, Python läuft auch auf VMS, RISC OS und anderen ungeradee Plattformen, die völlig unterschiedliche Dateinamen-Konventionen verwenden. Allerdings ist es wahrscheinlich, dass Ihre Anwendung zu erhalten versuchen, auf VMS laufen, blind, ist irgendwie albern sowieso - „vorzeitige Portabilität die Wurzel einiger relativ geringe Übel ist“

Ich mag die os.path Funktionen sowieso, weil sie Absicht auszudrücken gut sind -. Anstatt nur einen String-Verkettung, die für jede von einer Million Zwecke getan werden könnte, liest sehr explizit als Weg Manipulation

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

  • die erlaubten Zeichen in Dateinamen
  • die besonderen Namen und
  • Groß- und Kleinschreibung

Windows ist restriktiver in den ersten beiden Konten (dies ist, hat es mehr verbotene Zeichen und mehr spezielle Namen), während Unix typischerweise Groß- und Kleinschreibung. Es gibt einige Antworten Listing hier genau das, was diese Zeichen und Namen sind. Ich werde sehen, ob ich sie finden kann.

Nun, wenn Ihre Entwicklungsumgebung mit einer Funktion kommt Pfade zu erstellen oder zu manipulieren, sollten Sie es verwenden, es ist es für einen Grund, weißte. Besonders gegeben, dass es viel mehr Plattformen als Windows und Unix.

Die Beantwortung Ihrer ersten Frage, ja ../dir/file funktionieren wird, es sei denn, sie einige der oben genannten Unvereinbarkeiten getroffen.

OS / X und Linux sind beide Unix kompatibel, so definitions sie das Format verwenden Sie am Anfang der Frage gab. Windows erlaubt „/“ zusätzlich zu „\“, so dass Programme mit Xenix austauschbar sein könnten, eine Unix-Variante, die Microsoft wurde vor langer Zeit mit dem Versuch heraus, und dass die Kompatibilität Vorlauf bis zur Gegenwart durch wurde. So auch es funktioniert.

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

Wie andere gesagt haben, ein Schrägstrich wird in allen Fällen funktionieren, aber du bist besser dran, eine Liste der Pfadsegmente zu schaffen und os.path.join (). - Ing sie

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top