Python'da geçici dizin almanın platformlar arası yolu


255

tempPython 2.6'da dizine giden yolu almanın çapraz platform yolu var mı ?

Örneğin, Linux /tmpaltında, XP altındayken C:\Documents and settings\[user]\Application settings\Temp.


pythonist değil, ancak geçici yöntemler / dizinler oluşturmak için bu yöntemleri kullanmalısınız
skrat

1
Docs.python.org/library/tempfile.html adresindeki geçici dosya modülüne bakın .
Jordan Parmer

Yanıtlar:


381

Bu geçici dosya modülü olurdu .

Geçici dizini almak için işlevleri vardır ve ayrıca adlandırılmış veya adlandırılmamış geçici dosyalar ve dizinler oluşturmak için bazı kısayollara sahiptir.

Misal:

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

Tamlık için, belgelere göre geçici dizini nasıl aradığı aşağıda açıklanmıştır:

  1. TMPDIROrtam değişkeni tarafından adlandırılan dizin .
  2. TEMPOrtam değişkeni tarafından adlandırılan dizin .
  3. TMPOrtam değişkeni tarafından adlandırılan dizin .
  4. Platforma özgü bir konum:
    • RiscOS üzerinde , Wimp$ScrapDirortam değişkeni tarafından adlandırılan dizin .
    • Açık , Windows , dizinleri C:\TEMP, C:\TMP, \TEMP, ve \TMP, bu sırayla.
    • Diğer tüm platformlarda, dizinlere günü /tmp, /var/tmpve /usr/tmpbu sırayla.
  5. Son çare olarak, geçerli çalışma dizini.

7
Benim için, OSX bunu /var/folders/<garbage/here>yerine koyuyor /tmpçünkü böyle $TMPDIRayarlanıyor. Buraya bakın .
Rick Smith

3
Şu anda Windows 10 piton 3.6.5 ile tempfile.gettempdir()çözümlenir C:\users\user\AppData\Local\Temp. Ne yazık ki uzun bir yol.
solvingJ

61

Bu istediğinizi yapmalıdır:

print tempfile.gettempdir()

Benim için Windows kutumda:

c:\temp

ve Linux kutumda:

/tmp

15

Kullanırım:

from pathlib import Path
import platform
import tempfile

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

Bu, MacOS, yani Darwin olduğu, tempfile.gettempdir()ve os.getenv('TMPDIR')bu gibi bir değer iade '/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'; her zaman istemediğim bir şey.


1
En azından bu durumda MacOS size kullanıcı düzeyinde yalıtılmış bir geçici dizin döndürmek için doğru olanı yapar. İşletim sistemi ile uğraşmak istemediğiniz sürece% 99.99 eminim ...
sorin

1
@sorin% 99.99 bir esnektir. % 50 daha gerçekçi diyebilirim. Çoğunlukla çoklu işleme ile çalışıyorum ve sonra tüm süreçler için aynı sıcaklık yönünü isteyebilirim.
Acumenus

11

@ Nosklo'nun yorum ve cevabına dayanan en basit yol :

import tempfile
tmp = tempfile.mkdtemp()

Ancak dizinlerin oluşturulmasını manuel olarak kontrol etmek istiyorsanız:

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

Bu şekilde işiniz bittiğinde (gizlilik, kaynaklar, güvenlik, ne olursa olsun) kendiniz sonra kolayca temizleyebilirsiniz:

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

Bu, Google Chrome ve Linux gibi uygulamalara benzer systemd. Varlıklarını "tanıtmak" için yalnızca daha kısa bir onaltılık karma ve uygulamaya özel bir önek kullanırlar.


1
tempfile.mkdtemp()bunun yerine kullanmalısınız
nosklo

@nosklo, bu kesinlikle bir seçenektir ve geçici dosya paketinde yerleşik olan tüm sağlamlıktan yararlanır, ancak karma yaklaşımı, seçtiğiniz bir yol oluşturmanıza ve gereksinimlerinizi karşılayan bir dizin ağacında birden çok dizin iç içe geçirmenize olanak tanır. Temel olarak mkdtemp()önerdiğiniz daha açık, daha esnek bir sürümüdür .
ocaklar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.