3

ファイルを作成しようとしています。このファイルには、処理する必要があるすべてのファイルをスクリプトに入れ、そのファイルをパラメーターとして渡します。私の問題は、リストがバッファを埋めるのに十分な長さではなく、ディスクに何も書き込まれないことがあることです。一時ファイルをフラッシュして fsync しようとしましたが、何も起こりません。スクリプトはサード パーティのスクリプトなので、パラメーターの受け渡し方法を変更することはできません。

with tempfile.NamedTemporaryFile(bufsize=0) as list_file:
    list_file.write("\n".join(file_list) + "\n")
    list_file.flush()
    os.fsync(list_file)

    command = "python " + os.path.join(SCRIPT_PATH, SCRIPT_NAME) + " --thread --thread_file "
    ppss_command = [SCRIPT_PATH + "/ppss", "-f", list_file.name, "-c", command]
    p = subprocess.Popen(ppss_command)
    out,err = p.communicate()

最終的なソリューション コード (jterrace の回答):

with tempfile.NamedTemporaryFile(delete=False) as list_file:
     list_file.write("\n".join(file_list) + "\n")
     list_file.close()
     command = "python " + os.path.join(SCRIPT_PATH, SCRIPT_NAME) + " --thread --thread_file "
     ppss_command = [SCRIPT_PATH + "/ppss", "-f", list_file.name, "-c", command]
     p = subprocess.Popen(ppss_command)
     out, err = p.communicate()
     list_file.delete = True
4

1 に答える 1

2

NamedTemporaryFile docstringから:

名前付きの一時ファイルがまだ開いている間に、その名前を使用してファイルをもう一度開くことができるかどうかは、プラットフォームによって異なります (Unix では使用できますが、Windows NT 以降では使用できません)。

そのため、ファイルを開いたままにしておくと、サブプロセスから読み取ることができない場合があります。代わりに私がすることは次のとおりです。

fd, tmp_fpath = tempfile.mkstemp()
os.close(fd) # Needed on Windows if you want to access the file in another process

try:
    with open(tmp_fpath, "wb") as f:
        f.write("\n".join(file_list) + "\n")

    # ... subprocess stuff ...
    do_stuff_with(tmp_fpath)
finally:
    os.remove(tmp_fpath)
于 2013-06-28T18:11:19.387 に答える