2013-02-23 30 views
24

Sono molto confuso quando utilizzare os.open e quando utilizzare os.fdopenqual è la differenza tra l'os.open e os.fdopen in python

stavo facendo tutto il mio lavoro con os.open e ha funzionato senza alcun problema, ma io non sono in grado di capire in condizioni di che cosa abbiamo bisogno file descriptors e tutte le altre funzioni, come dup e fsync

È il file object diverso da file descriptor

voglio dire f = os.open("file.txt",w)

Ora è il file oggetto o il fileedificatore?

+0

Secondo [la documentazione] (http: //docs.python.org/2/library/os.html#os.open), os.open() restituisce un descrittore di file, mentre il builtin open() restituisce un oggetto file. – Octipi

risposta

41

Si sta confondendo la funzione integrata open() con os.open() fornita dal modulo os. Sono abbastanza diversi; os.open(filename, "w") non è valido Python (os.open accetta i flag di numero intero come secondo argomento), open(filename, "w") è.

Insomma, open() crea nuovi oggetti file, os.open() crea descrittori di file a livello di sistema operativo, e os.fdopen() crea un oggetto file da un descrittore di file.

I descrittori di file sono una funzionalità di basso livello per lavorare con i file forniti direttamente dal kernel del sistema operativo. Un descrittore di file è un piccolo numero intero che identifica il file aperto in una tabella di file aperti mantenuti dal kernel per ogni processo. Un certo numero di chiamate di sistema accetta i descrittori di file, ma non sono comodi da utilizzare, in genere richiedono buffer a larghezza fissa, tentativi multipli in determinate condizioni e gestione manuale degli errori.

Gli oggetti file sono classi Python che racchiudono i descrittori di file per rendere il lavoro con i file più conveniente e meno soggetto a errori. Forniscono, ad esempio, la gestione degli errori, il buffering, la lettura riga per riga, le conversioni del set di caratteri e vengono chiusi al termine della raccolta dei dati obsoleti.

per ricapitolare:

  • Built-in open() prende un nome di file e restituisce un nuovo oggetto file Python. Questo è ciò di cui hai bisogno nella maggior parte dei casi.

  • os.open() accetta un nome file e restituisce un nuovo descrittore di file. Questo descrittore di file può essere passato ad altre funzioni di basso livello, come os.read() e os.write(), oppure a os.fdopen(), come descritto di seguito. Ne hai bisogno solo quando scrivi un codice che dipende dalle API dipendenti dal sistema operativo, come l'utilizzo del flag O_EXCL su open(2).

  • os.fdopen() prende un descrittore di file esistente - tipicamente prodotta dalle chiamate di sistema Unix come pipe() o dup(), e costruisce un oggetto file Python intorno ad esso. Effettivamente converte un descrittore di file in un oggetto file completo, che è utile quando si interfaccia con il codice C o con API che creano solo descrittori di file di basso livello.

incorporato open può essere implementato utilizzando os.open() (per creare un descrittore di file) e os.fdopen() (ad avvolgerla in un oggetto di file):

# equivalent to open(filename, "r") 
f = os.fdopen(os.open(filename, os.O_RDONLY)) 
+0

hai ragione, sono stato confuso con 'open' e' os.open() '. puoi darmi qualche esempio di codice in cui, posso usare 'fd' per fare qualcosa che non è possibile con il normale' open'. Voglio sapere come funziona – user1994660

+0

@ user1994660 Come ho detto nella risposta, non è possibile passare 'O_EXCL' o altri flag specifici del sistema per incorporare' open() '. Per quanto riguarda 'os.fdopen()', le API Unix come 'pipe()', 'dup()', ecc. Restituiscono descrittori di file, non oggetti di file. In questo caso useresti 'os.fdopen' per convertire tali descrittori in oggetti di file. – user4815162342

Problemi correlati