Python - Come posso convertire "un handle a livello di sistema operativo in un file aperto" in un oggetto file?

StackOverflow https://stackoverflow.com/questions/168559

Domanda

tempfile.mkstemp () restituisce:

  

una tupla contenente un handle a livello di sistema operativo in un file aperto (come verrebbe restituito da os.open ()) e il percorso assoluto di quel file, in questo ordine.

Come posso convertire l'handle a livello di sistema operativo in un oggetto file?

La documentazione per os.open () stati:

  

Per avvolgere un descrittore di file in un file " ;.   oggetto " ;, usa fdopen ().

Quindi ho provato:

>>> import tempfile
>>> tup = tempfile.mkstemp()
>>> import os
>>> f = os.fdopen(tup[0])
>>> f.write('foo\n')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
IOError: [Errno 9] Bad file descriptor
È stato utile?

Soluzione

Puoi usare

os.write(tup[0], "foo\n")

per scrivere sull'handle.

Se si desidera aprire la maniglia per la scrittura, è necessario aggiungere la modalità " w "

f = os.fdopen(tup[0], "w")
f.write("foo")

Altri suggerimenti

Ecco come farlo usando un'istruzione with:

from __future__ import with_statement
from contextlib import closing
fd, filepath = tempfile.mkstemp()
with closing(os.fdopen(fd, 'w')) as tf:
    tf.write('foo\n')

Hai dimenticato di specificare la modalità aperta ('w') in fdopen (). L'impostazione predefinita è 'r', causando il fallimento della chiamata write ().

Penso che mkstemp () crei il file per la sola lettura. Chiamare fdopen con 'w' probabilmente lo riapre per la scrittura (puoi puoi riaprire il file creato da mkstemp).

temp = tempfile.NamedTemporaryFile(delete=False)
temp.file.write('foo\n')
temp.close()

Qual è il tuo obiettivo, qui? tempfile.TemporaryFile è inappropriato per i tuoi scopi?

Non posso commentare le risposte, quindi posterò il mio commento qui:

Per creare un file temporaneo per l'accesso in scrittura puoi usare tempfile.mkstemp e specificare " w " come ultimo parametro, come:

f = tempfile.mkstemp("", "", "", "w") # first three params are 'suffix, 'prefix', 'dir'...
os.write(f[0], "write something")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top