2013-01-11 22 views
13

In Python 3.2 (e altre versioni), i documentation for os.open stati:Caso di utilizzo per os.open, os.fdopen e amici di basso livello?

Questa funzione è destinato a basso livello di I/O. Per l'utilizzo normale, utilizzare la funzione built-in open(), che restituisce un oggetto file con i metodi read() e write() (e molti altri). Per avvolgere un descrittore di file in un oggetto file, utilizzare fdopen().

E for fdopen():

restituire un oggetto file aperto collegato al descrittore di file fd. Questo è un alias di open() e accetta gli stessi argomenti. L'unica differenza è che il primo argomento di fdopen() deve sempre essere un numero intero.

This comment in una domanda sulla differenza tra io.open e os.open (questa differenza è del tutto chiaro per me, io uso sempre io.open, mai os.open) chiede: perché qualcuno dovrebbe scegliere Python per basso livello di I/O?, ma in realtà non ottiene una risposta.

La mia domanda è molto simile al commento-domanda: In Python, qual è il caso d'uso di basso livello I/O tramite os.open, os.fdopen, os.close, os.read, ecc? Ero solito pensare che fosse necessario per deamonizzare un processo, ma I'm not so sure anymore. È possibile eseguire solo utilizzando l'I/O di basso livello e non con i wrapper di livello superiore?

+0

La mia ipotesi è che i wrapper di livello superiore utilizzino queste funzioni. Per lo meno il modulo 'tempfile' usa la maggior parte di questi su python 2.7.3 ... – mgilson

+0

@mgilson Quindi la mia domanda è, perché non posso usare tempfile quelli di livello superiore? – gerrit

risposta

4

Differenze principali:

  • basso livello di accesso ai file è unbuffered
  • accesso a basso livello non è portatile
  • basso livello consente un controllo più fine, ad esempio, se bloccare o non bloccare upon leggere

Usa casi low io Sali:

  • Il file è un dispositivo a blocchi
  • Il file è un socket
  • Il file è un tty
  • ...

In tutti questi casi si potrebbe desiderare di avere un controllo più fine (con buffering e comportamento di blocco).

Probabilmente non avrai mai bisogno delle funzioni di basso livello per i file normali. Penso che la maggior parte delle volte il caso d'uso sarà roba del driver di periferica. Tuttavia, sarebbe meglio farlo in C. Ma posso vedere anche il caso d'uso di python, ad es. per la prototipazione rapida dei driver di dispositivo.

5

Io lo uso quando ho bisogno di usare O_CREAT | O_EXCL per creare un file atomicamente, in mancanza se il file esiste. Non è possibile verificare la presenza di file, quindi creare il file se il test ha rilevato che non esiste, poiché ciò creerà una condizione di competizione in cui il file potrebbe essere creato nel periodo intermedio tra il controllo e la creazione.

Brevemente a the link you provided, credo che la creazione di pidfile abbia una condizione di competizione.

In Python 3.3, è stato aggiunto a new 'x' mode a open() che sembra farlo. Non ho provato, però.