4

一度だけ使用するフォルダーを作成する必要がありますが、次の実行まで存在する必要があります。標準ライブラリの tmp_file モジュールを使用する必要があるようですが、必要な動作を取得する方法がわかりません。

現在、ディレクトリを作成するために次のことを行っています。

randName = "temp" + str(random.randint(1000, 9999))
os.makedirs(randName)

ディレクトリを削除したいときは、「temp」を含むディレクトリを探します。
これは汚いハックのように思えますが、現時点ではより良い方法がわかりません。

ちなみに、フォルダーが必要な理由は、フォルダーを使用するプロセスを次のように開始するためです。

subprocess.Popen([command], shell=True).pid

次に、スクリプトを終了して、他のプロセスが作業を終了できるようにします。

4

7 に答える 7

16

4 桁の乱数でフォルダーを作成することは安全ではなく、プログラムの他のインスタンスとの衝突についても心配する必要があります。

より良い方法は、 を使用してフォルダーを作成するtempfile.mkdtempことです。これは、まさに目的どおりに実行されます (つまり、スクリプトが終了してもフォルダーは削除されません)。次に、フォルダー名を引数として 2 番目の Popen されたスクリプトに渡し、それを削除する責任があります。

于 2009-02-24T14:18:50.647 に答える
8

あなたが提案したことは危険です。アプリケーションの他のインスタンスを含め、他の誰かがそれらのディレクトリを作成しようとすると、競合状態が発生する可能性があります。また、「temp」を含むものを削除すると、意図した以上に削除される可能性があります。他の人が述べたように、tempfile.mkdtempはおそらく最も安全な方法です。サブプロセスを起動して新しいディレクトリを使用するなど、説明した内容の例を次に示します。

import tempfile
import shutil
import subprocess

d = tempfile.mkdtemp(prefix='tmp')
try:
    subprocess.check_call(['/bin/echo', 'Directory:', d])
finally:
    shutil.rmtree(d)
于 2009-02-24T15:43:23.627 に答える
4

「一度だけ使用するフォルダーを作成する必要がありますが、次の実行までそのフォルダーが存在している必要があります。」

「ちなみに、フォルダが必要なのは、プロセスを開始するためです...」

偶然ではありません。重要。

次のデザインパターンがあるようです。

mkdir someDirectory
proc1 -o someDirectory # Write to the directory
proc2 -i someDirectory # Read from the directory
if [ %? == 0 ]
then
    rm someDirectory
fi

それはあなたがシェルレベルで書くようなものですか?

その場合は、Pythonアプリケーションをいくつかの部分に分割することを検討してください。

  • 実際の作業を行う部分(「proc1」および「proc2」)

  • リソースとプロセスを管理するシェル。基本的に、bashスクリプトの代わりにPythonを使用します。

于 2009-02-24T14:40:04.010 に答える
3

一時ファイルは、1 回のプログラム実行の間持続するものです。

したがって、必要なのは一時ファイルではありません。

また、単一のマシンで複数のユーザーに注意してください。ディレクトリが邪魔にならないように安全に配置されていない場合、「temp」パターンで何かを削除するだけで反社会的である可能性があります.

また、一部のマシンでは/tmp、マシンの再起動時にファイル システムが再構築されることに注意してください。

于 2009-02-24T14:12:06.263 に答える
2

次の手順を実行することで、(エラーの有無にかかわらず)任意の出口で一時ディレクトリを完全に削除する関数を自動的に登録することもできます。

import atexit
import shutil
import tempfile

# create your temporary directory
d = tempfile.mkdtemp()

# suppress it when python will be closed
atexit.register(lambda: shutil.rmtree(d))

# do your stuff...
subprocess.Popen([command], shell=True).pid
于 2010-12-02T01:04:20.843 に答える
1

一時ファイル名を作成する最良の方法は、tempName.TemporaryFile(mode='w+b', suffix='.tmp', prifix='someRandomNumber' dir=None) を使用するか、mktemp() 関数を使用することです。

mktemp() 関数は実際にはファイルを作成しませんが、一意のファイル名を提供します (実際には PID は含まれません)。

于 2009-09-12T06:00:59.420 に答える
1

tempfileそれは問題ありませんが、安全を期すために、次の実行までディレクトリ名をどこかに安全にする必要があります。たとえば、ピクルします。次に、次の実行でそれを読み取り、ディレクトリを削除します。/tmpルートには必須ではなく、そのためtempfile.mkdtempのオプションのdirパラメーターがあります。ただし、概して、現在行っていることと変わりません。

于 2009-02-24T14:19:27.900 に答える