2017-12-14 6 views
0

나는 파이썬 3의 우분투 16.04에서 내용을 tempfile.NamedTemporaryFile에 쓰려고합니다. 특정 상황에서 필자는 쓰기가 완료된 후 해당 파일을 다른 위치에 복사하려고합니다. 이 문제는 다음 코드를 재생 : 실행이 끝나면Linux에서 NamedTemporaryFile을 복사하면 빈 파일이됩니다.

import tempfile 
import shutil 

with tempfile.NamedTemporaryFile('w+t') as tmp_file: 
    print('Hello, world', file=tmp_file) 
    shutil.copy2(tmp_file.name, 'mytest.txt') 

mytest.txt가 비어 있습니다. NamedTemporaryFile을 만들 때 delete=False을 사용하면 해당 콘텐츠를 /tmp/에서 검사 할 수 있으며 문제가 없습니다.

문서에 따라 Windows에서 파일을 열어도 파일을 다시 열 수는 없다는 것을 알고 있지만 Linux는 정상적으로 작동하므로 예상하지는 않습니다.

무슨 일이 일어나고 있으며 어떻게 해결 될 수 있습니까?

답변

0

문제는 print() 호출이 플러시되지 않기 때문에 파일을 복사 할 때 아무 것도 아직 쓰여지지 않은 것입니다.

import tempfile 
import shutil 

with tempfile.NamedTemporaryFile('w+t') as tmp_file: 
    print('Hello, world', file=tmp_file, flush=True) 
    shutil.copy2(tmp_file.name, 'mytest.txt') 
: print()의 파라미터로서 사용 flush=True

문제를 해결