Pythonで一時ディレクトリを取得するクロスプラットフォームの方法


255

tempPython 2.6のディレクトリへのパスを取得するクロスプラットフォームの方法はありますか?

たとえば、Linuxの場合は、/tmpXPの場合C:\Documents and settings\[user]\Application settings\Tempです。


pythonistではありませんが、一時ファイル/ディレクトリを作成するにはこれらの方法を使用する必要があります
skrat

1
docs.python.org/library/tempfile.htmlにあるtempfileモジュールを参照してください。
ジョーダンパーマー、

回答:


379

これはtempfileモジュールです。

一時ディレクトリを取得する関数があり、名前付きまたは名前なしの一時ファイルとディレクトリを作成するためのショートカットもあります。

例:

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

ドキュメントによると、完全を期すために、一時ディレクトリを検索する方法は次のとおりです。

  1. TMPDIR環境変数で指定されたディレクトリ。
  2. TEMP環境変数で指定されたディレクトリ。
  3. TMP環境変数で指定されたディレクトリ。
  4. プラットフォーム固有の場所:
    • RISCOS、ディレクトリがで指定されたWimp$ScrapDir環境変数。
    • のWindows、ディレクトリC:\TEMPC:\TMP\TEMP、および\TMP、そのためです。
    • 他のすべてのプラットフォーム、ディレクトリでは/tmp/var/tmp、および/usr/tmp、そのためです。
  5. 最後の手段として、現在の作業ディレクトリ。

7
私にとって、OSXはそれが設定されているためでは/var/folders/<garbage/here>なく、それを配置しています。こちらをご覧ください/tmp$TMPDIR
リックスミス

3
現在、Windows 10のpython 3.6.5では、にtempfile.gettempdir()解決されC:\users\user\AppData\Local\Tempます。残念ながら長い道のり。
solveJ 2018

61

これはあなたが望むことをするはずです:

print tempfile.gettempdir()

私のWindowsボックスでは、次のものが得られます。

c:\temp

私のLinuxボックスでは次のようになります。

/tmp

15

私が使う:

from pathlib import Path
import platform
import tempfile

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

これは、MacOS、つまりダーウィンでは、次のような値tempfile.gettempdir()os.getenv('TMPDIR')返すためです'/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'。いつも欲しくないものです。


1
少なくともこの場合、MacOSはユーザーレベルの分離された一時ディレクトリを返すという正しいことを行います。これはあなたが必要なものだと私は99.99%確信しています...オペレーティングシステムを台無しにしたくない場合を除きます。
ソリン

1
@sorin 99.99%はストレッチです。50%がより現実的だと思います。多くの場合、マルチプロセッシングを使用しているため、すべてのプロセスで同じ一時ディレクトリを使用できます。
Acumenus

11

@noskloのコメントと回答に基づく最も簡単な方法:

import tempfile
tmp = tempfile.mkdtemp()

しかし、ディレクトリの作成を手動で制御したい場合:

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

そうすれば、次のようにして(プライバシー、リソース、セキュリティなどの目的で)完了したら、自分の後に簡単にクリーンアップできます。

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

これは、Google ChromeやLinuxなどのアプリケーションが行うことと似ていますsystemd。短い16進数のハッシュとアプリ固有のプレフィックスを使用して、その存在を「宣伝」するだけです。


1
tempfile.mkdtemp()代わりに使用する必要があります
nosklo

@nosklo、これは確かにオプションであり、tempfileパッケージに組み込まれているすべての堅牢性を利用しますが、ハッシュアプ​​ローチを使用すると、選択したパスを作成し、要件を満たすディレクトリツリーに複数のディレクトリをネストできます。基本的には、mkdtemp()あなたが提案したより明示的で柔軟なバージョンです。
ホブ、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.