Percorsi Unix: lavorare ufficialmente in Python per qualsiasi piattaforma?
-
06-07-2019 - |
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)?
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.