Ho un programma Python che deve creare un file temporaneo con nome che verrà aperto e chiuso un paio di volte nel corso del programma, e dovrebbe essere cancellato quando il programma termina. Purtroppo, nessuna delle opzioni in tempfile
sembra funzionare:Come posso creare un file temporaneo con nome su Windows in Python?
TemporaryFile
non hai un nome visibileNamedTemporaryFile
crea un oggetto simile a file. Ho solo bisogno di un nome di file. Ho provato a chiudere l'oggetto restituito (dopo aver impostatodelete = False
) ma ottengo errori di flusso quando tento di aprire il file in un secondo momento.- non ha un nome visibile
mkstemp
restituisce sia l'oggetto file aperto che il nome; non garantisce il file viene eliminato quando il programma escemktemp
restituisce il nome del file, ma non garantisce il file viene eliminato quando il programma esce
Ho provato con mktemp
all'interno un gestore di contesto, in questo modo:
def get_temp_file(suffix):
class TempFile(object):
def __init__(self):
self.name = tempfile.mktemp(suffix = '.test')
def __enter__(self):
return self
def __exit__(self, ex_type, ex_value, ex_tb):
if os.path.exists(self.name):
try:
os.remove(self.name)
except:
print sys.exc_info()
return TempFile()
... ma che mi dà un WindowsError(32, 'The process cannot access the file because it is being used by another process')
. Il nome del file è usato da un processo che il mio programma genera, e anche se mi assicuro che il processo finisca prima di uscire, sembra che abbia una condizione di competizione fuori dal mio controllo.
Qual è il modo migliore per affrontare questo?
Non ho bisogno di preoccuparmi della sicurezza qui; questo fa parte di un modulo di test, quindi la maggior parte delle persone malvagie potrebbe fare in modo che i nostri test unitari falliscano spuriemente. L'orrore!
Le questioni di sicurezza non incidono il programma utilizzando il file temporaneo, interessano l'intero sistema il file temporaneo viene creato (ad esempio, un collegamento simbolico a un importante file dopo che è stato creato). –
Sei sicuro che tutti gli oggetti file che aprono il file temporaneo vengono chiusi correttamente? – user49117
Il nome file viene passato a un processo di Windows tramite Popen(), e quando ho finito con esso, chiamo .flush() sui flussi .sysin, .sysout e .syserr e poi chiamo .wait() sul processi. È racchiuso in un ContextManager, quindi sono sicuro che si chiami. Non sono sicuro di cos'altro potrei fare. –