Maneira multiplataforma de obter o diretório temporário em Python

255

Existe uma maneira multiplataforma de obter o caminho para o tempdiretório no Python 2.6?

Por exemplo, no Linux /tmp, enquanto no XP C:\Documents and settings\[user]\Application settings\Temp.

Joril
fonte
não um pythonist, mas você deve usar estes métodos para a criação de arquivos temporários / diretórios
SKRAT
1
Veja o módulo tempfile em docs.python.org/library/tempfile.html .
Jordan Parmer

Respostas:

379

Esse seria o módulo tempfile .

Possui funções para obter o diretório temporário e também possui alguns atalhos para criar arquivos e diretórios temporários, com ou sem nome.

Exemplo:

import tempfile

print tempfile.gettempdir() # prints the current temporary directory

f = tempfile.TemporaryFile()
f.write('something on temporaryfile')
f.seek(0) # return to beginning of file
print f.read() # reads data back from the file
f.close() # temporary file is automatically deleted here

Para completar, veja como ele procura o diretório temporário, de acordo com a documentação:

  1. O diretório nomeado pela TMPDIRvariável de ambiente.
  2. O diretório nomeado pela TEMPvariável de ambiente.
  3. O diretório nomeado pela TMPvariável de ambiente.
  4. Um local específico da plataforma:
    • No RiscOS , o diretório nomeado pela Wimp$ScrapDirvariável de ambiente.
    • Por do Windows , os diretórios C:\TEMP, C:\TMP, \TEMP, e \TMP, nessa ordem.
    • Em todas as outras plataformas, os diretórios /tmp, /var/tmpe /usr/tmp, nessa ordem.
  5. Como último recurso, o diretório de trabalho atual.
nosklo
fonte
7
Para mim, o OSX está colocando isso em /var/folders/<garbage/here>vez de /tmpporque é assim que $TMPDIRestá definido. Veja aqui .
Rick Smith
3
Atualmente, com o python 3.6.5 no Windows 10, tempfile.gettempdir()resolve para C:\users\user\AppData\Local\Temp. Infelizmente, um longo caminho.
usar o seguinte código
61

Isso deve fazer o que você deseja:

print tempfile.gettempdir()

Para mim na minha caixa do Windows, recebo:

c:\temp

e na minha caixa Linux eu recebo:

/tmp
RichieHindle
fonte
15

Eu uso:

from pathlib import Path
import platform
import tempfile

tempdir = Path("/tmp" if platform.system() == "Darwin" else tempfile.gettempdir())

Isso ocorre no MacOS, ou seja, Darwin, tempfile.gettempdir()e os.getenv('TMPDIR')retorna um valor como '/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'; é aquele que eu nem sempre quero.

Acumenus
fonte
1
Pelo menos nesse caso, o MacOS faz a coisa certa ao retornar um diretório temporário isolado no nível do usuário. Tenho 99,99% de certeza de que é isso que você precisa ... a menos que queira mexer com o sistema operacional.
sorin
1
@sorin 99,99% é um alongamento. Eu diria que 50% é mais realista. Muitas vezes, estou trabalhando com multiprocessamento e, em seguida, posso querer o mesmo diretório temporário para todos os processos.
Acumenus 03/01
11

A maneira mais simples, com base no comentário de @ nosklo e resposta do :

import tempfile
tmp = tempfile.mkdtemp()

Mas se você deseja controlar manualmente a criação dos diretórios:

import os
from tempfile import gettempdir
tmp = os.path.join(gettempdir(), '.{}'.format(hash(os.times())))
os.makedirs(tmp)

Dessa forma, você pode facilmente limpar você mesmo quando terminar (por privacidade, recursos, segurança, o que for) com:

from shutil import rmtree
rmtree(tmp, ignore_errors=True)

Isso é semelhante ao que aplicativos como Google Chrome e Linux systemdfazem. Eles apenas usam um hash hex menor e um prefixo específico do aplicativo para "anunciar" sua presença.

fogão
fonte
1
você deve usar em tempfile.mkdtemp()vez disso
nosklo 15/05/19
@nosklo, essa é certamente uma opção e aproveitaria toda a robustez incorporada ao pacote tempfile, mas a abordagem de hash permite criar um caminho de sua escolha e aninhar vários diretórios em uma árvore de diretórios que atenda aos seus requisitos. É basicamente uma versão mais explícita e flexível do que mkdtemp()você sugeriu.
hobs