Domanda

Tutti i percorsi in un programma Python possono usare " .. " (per la directory principale) e / (per la separazione dei componenti del percorso) e funzionano ancora qualunque sia la piattaforma ?

Da un lato, non ho mai visto un simile reclamo nella documentazione (potrei averlo perso), e i moduli os e os.path forniscono strutture per gestire i percorsi in modo agnostico in piattaforma (os.pardir, os .path.join, & # 8230;), che mi fa pensare che siano qui per un motivo.

D'altra parte, puoi leggere su StackOverflow che " ../ path / to / file " funziona su tutte le piattaforme & # 8230;

Quindi, os.pardir, os.path.join e gli amici dovrebbero sempre essere usati, per scopi di portabilità, o i nomi dei percorsi Unix sono sempre sicuri (fino a possibili problemi di codifica dei caratteri)? o forse " quasi sempre " sicuro (vale a dire lavorare con Windows, OS X e Linux)?

È stato utile?

Soluzione

" Quasi sempre sicuro " è giusto. Tutte le piattaforme che ti interessano probabilmente funzioneranno bene oggi e non credo che cambieranno presto le loro convenzioni.

Tuttavia Python è molto portatile e funziona su molto più delle solite piattaforme. Il motivo per cui il modulo os è quello di facilitare le cose su di esso una piattaforma ha requisiti diversi.

C'è una buona ragione per non usare le funzioni os ?

os.pardir è auto-documentato mentre " .. " non lo è, e os.pardir potrebbe essere più facile da chiamare

Ecco alcuni documenti di Python 1.6 quando il Mac era ancora diverso per tutto

  

Routine OS per Mac, DOS, NT o Posix a seconda del sistema in uso   on.

     

Questo esporta:     - tutte le funzioni di posix, nt, dos, os2, mac o ce, ad es. scollega, stat, ecc.     - os.path è uno dei moduli posixpath, ntpath, macpath o dospath     - os.name è 'posix', 'nt', 'dos', 'os2', 'mac' o 'ce'     - os.curdir è una stringa che rappresenta la directory corrente ('.' o ':')     - os.pardir è una stringa che rappresenta la directory principale ('..' o '::')     - os.sep è il separatore del percorso (o il più comune) ('/' o ':' o '\')     - os.altsep è il separatore di percorso alternativo (Nessuno o '/')     - os.pathsep è il separatore di componenti utilizzato in $ PATH ecc     - os.linesep è il separatore di riga nei file di testo ('' o '' o '')     - os.defpath è il percorso di ricerca predefinito per gli eseguibili

     

I programmi che importano e usano 'os' hanno maggiori possibilità di essere   portatile tra piattaforme diverse. Certo, devono solo allora   utilizzare funzioni definite da tutte le piattaforme (ad es. unlink e   opendir) e lasciare tutta la manipolazione del nome percorso su os.path (ad esempio, split   e unisciti).

Altri suggerimenti

Non ho mai avuto problemi con l'uso di .. , anche se potrebbe essere una buona idea convertirlo in un percorso assoluto usando os.path.abspath . In secondo luogo, consiglierei sempre di utilizzare os.path.join ove possibile. Ci sono molti casi angolari (oltre ai problemi di portabilità) nell'unire percorsi, ed è bene non doversi preoccupare di loro. Ad esempio:

>>> '/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'

Potresti riscontrare problemi con l'utilizzo di .. se ti trovi su alcune piattaforme oscure, ma non posso nominare alcuna (Windows, * nix e OS X supportano tutte quella notazione).

All'interno di Python, l'utilizzo di / funzionerà sempre. Sarà necessario conoscere la convenzione del sistema operativo se si desidera eseguire un comando in una subshell

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

Il comando n. 1 probabilmente funzionerà come previsto.
Il comando n. 2 potrebbe non funzionare se myprog è un comando di Windows e prevede di analizzare gli argomenti della riga di comando per ottenere un nome di file di Windows.

Funziona su Windows, quindi se definisci " qualunque sia la piattaforma " per essere Unix e Windows, stai bene.

D'altra parte, Python funziona anche su VMS, RISC OS e altre piattaforme dispari che usano convenzioni di nomi di file completamente diverse. Tuttavia, è probabile che cercare di far funzionare la tua applicazione su VMS, cieco, sia in qualche modo sciocco - la "portabilità prematura è la radice di un male relativamente minore"

Mi piace comunque usare le funzioni os.path perché sono buone per esprimere l'intento - invece di solo una concatenazione di stringhe, che potrebbe essere fatta per uno qualsiasi dei milioni di scopi, si legge molto esplicitamente come una manipolazione del percorso.

Windows supporta / come separatore di percorso. Le uniche incompatibilità tra i nomi di file Unix e i nomi di file di Windows sono:

  • i caratteri consentiti nei nomi di file
  • i nomi speciali e
  • maiuscole / minuscole

Windows è più restrittivo nei primi due account (questo è, ha più caratteri proibiti e nomi più speciali), mentre Unix è in genere sensibile al maiuscolo / minuscolo. Ci sono alcune risposte qui elencando esattamente cosa sono questi personaggi e nomi. Vedrò se riesco a trovarli.

Ora, se il tuo ambiente di sviluppo ha una funzione per creare o manipolare percorsi, dovresti usarlo, è lì per un motivo, sai. Soprattutto dato che ci sono molte più piattaforme di Windows e Unix.

Rispondendo alla tua prima domanda, sì ../dir/file funzionerà, a meno che non colpiscano alcune delle incompatibilità sopra menzionate.

OS / X e Linux sono entrambi compatibili con Unix, quindi per definizione usano il formato che hai dato all'inizio della domanda. Windows consente " / " oltre a " \ " in modo che i programmi potessero essere intercambiabili con Xenix, una variante Unix che Microsoft stava provando molto tempo fa e che la compatibilità è stata portata avanti al presente. Così funziona anche.

Non so a quante altre piattaforme è stato portato Python e non posso parlare per loro.

Come altri hanno già detto, una barra in avanti funzionerà in tutti i casi, ma è meglio creare un elenco di segmenti di percorso e os.path.join () - ing.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top