Cara lintas-platform untuk mendapatkan direktori temp dengan Python


255

Apakah ada cara lintas platform untuk mendapatkan jalur ke tempdirektori di Python 2.6?

Misalnya, di Linux yang akan /tmp, sementara di bawah XP C:\Documents and settings\[user]\Application settings\Temp.


tidak pythonist, tetapi Anda harus menggunakan ini metode untuk membuat file sementara / direktori
skrat

Jawaban:


379

Itu akan menjadi modul tempfile .

Ini memiliki fungsi untuk mendapatkan direktori sementara, dan juga memiliki beberapa cara pintas untuk membuat file dan direktori sementara di dalamnya, baik bernama atau tidak disebutkan namanya.

Contoh:

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

Untuk kelengkapan, berikut cara mencari direktori sementara, sesuai dengan dokumentasi:

  1. Direktori dinamai oleh TMPDIRvariabel lingkungan.
  2. Direktori dinamai oleh TEMPvariabel lingkungan.
  3. Direktori dinamai oleh TMPvariabel lingkungan.
  4. Lokasi khusus platform:
    • Pada RiscOS , direktori dinamai oleh Wimp$ScrapDirvariabel environment.
    • Pada Windows , direktori C:\TEMP, C:\TMP, \TEMP, dan \TMP, dalam urutan itu.
    • Pada semua platform lainnya, direktori /tmp, /var/tmpdan /usr/tmp, dalam urutan itu.
  5. Sebagai pilihan terakhir, direktori kerja saat ini.

7
Bagi saya, OSX memasukkannya /var/folders/<garbage/here>bukan /tmpkarena itu $TMPDIRyang diatur. Lihat di sini .
Rick Smith

3
Saat ini, dengan python 3.6.5 di Windows 10, tempfile.gettempdir()memutuskan untuk C:\users\user\AppData\Local\Temp. Sayangnya jalannya panjang.
Mengatasi J

61

Ini harus melakukan apa yang Anda inginkan:

print tempfile.gettempdir()

Bagi saya di kotak Windows saya, saya mendapatkan:

c:\temp

dan di kotak Linux saya saya dapatkan:

/tmp

15

Saya menggunakan:

from pathlib import Path
import platform
import tempfile

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

Ini karena pada MacOS, yaitu Darwin, tempfile.gettempdir()dan os.getenv('TMPDIR')mengembalikan nilai seperti '/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'; itu salah satu yang tidak selalu saya inginkan.


1
Setidaknya dalam hal ini MacOS melakukan hal yang benar untuk mengembalikan Anda direktori temp terisolasi tingkat pengguna. Saya 99,99% yakin ini yang Anda butuhkan .... kecuali Anda ingin mengacaukan sistem operasi.
sorin

1
@ Atau dalam 99,99% adalah peregangan. Saya akan mengatakan 50% lebih realistis. Seringkali saya bekerja dengan multiprocessing dan kemudian saya ingin dir temp yang sama untuk semua proses.
Acumenus

11

Cara paling sederhana, berdasarkan komentar dan jawaban @ nosklo :

import tempfile
tmp = tempfile.mkdtemp()

Tetapi jika Anda ingin secara manual mengontrol pembuatan direktori:

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

Dengan begitu Anda dapat dengan mudah membersihkan diri sendiri setelah selesai (untuk privasi, sumber daya, keamanan, apa pun) dengan:

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

Ini mirip dengan apa yang dilakukan aplikasi seperti Google Chrome dan Linux systemd. Mereka hanya menggunakan hex hash yang lebih pendek dan awalan khusus aplikasi untuk "mengiklankan" keberadaan mereka.


1
Anda harus menggunakan tempfile.mkdtemp()bukannya
nosklo

@nosklo, itu tentu saja merupakan pilihan, dan akan mengambil keuntungan dari semua ketahanan yang ada pada paket tempfile, tetapi pendekatan hash memungkinkan Anda membuat jalur yang Anda pilih dan membuat sarang banyak direktori di pohon direktori yang memenuhi persyaratan Anda. Ini pada dasarnya versi yang lebih eksplisit, lebih fleksibel dari yang mkdtemp()Anda sarankan.
hobs
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.