필자는 프로그램 과정에서 열리고 닫히는 명명 된 임시 파일을 만들어야하는 Python 프로그램이 있으며 프로그램이 끝날 때 삭제해야합니다. Windows에서 이름이 지정된 임시 파일을 어떻게 만들 수 있습니까?
TemporaryFile
가 보이는 이름NamedTemporaryFile
이없는 파일 - 류의 객체를 생성 : 불행하게도,tempfile
의 옵션 중 어느 것도 제대로 작동하지 않습니다. 파일 이름이 필요합니다. 반환하는 개체를 닫으려고했는데 (delete = False
설정 후) 나중에 파일을 열려고 할 때 스트림 오류가 발생합니다.SpooledTemporaryFile
표시 이름이 없습니다.mkstemp
은 열린 파일 개체와 이름을 모두 반환합니다. 프로그램이mktemp
파일 이름을 반환 종료하지만, 프로그램이 내가 내
mktemp
1를 사용하려고했습니다
을 종료 할 때 삭제 된 파일을 보장하지 않는 경우이 파일이 삭제됩니다 보장하지 않습니다 컨텍스트 관리자 :
def get_temp_file(suffix):
class TempFile(object):
def __init__(self):
self.name = tempfile.mktemp(suffix = '.test')
def __enter__(self):
return self
def __exit__(self, ex_type, ex_value, ex_tb):
if os.path.exists(self.name):
try:
os.remove(self.name)
except:
print sys.exc_info()
return TempFile()
...하지만 저에게 WindowsError(32, 'The process cannot access the file because it is being used by another process')
을 제공합니다. 파일 이름은 프로세스가 내 프로그램을 생성하는 데 사용되며, 나가기 전에 프로세스가 끝났음에도 불구하고 내 제어에서 경쟁 조건이있는 것처럼 보입니다.
이 문제를 해결하는 가장 좋은 방법은 무엇입니까?
여기서는 보안에 대해 걱정할 필요가 없습니다. 이것은 테스트 모듈의 일부이기 때문에 가장 사악한 누군가가 할 수있는 것은 우리의 단위 테스트가 허위로 실패하는 것입니다. 공포!
이 보안 문제들이 임시 파일을 예를 들어 중요한에 심볼릭 링크 (에 생성되어 전체 시스템에 영향을 미치는, 임시 파일을 사용하여 프로그램에 영향을 미치지 않습니다 파일을 만든 후). –
임시 파일을 여는 모든 파일 객체가 제대로 닫혔습니까? – user49117
파일 이름은 Popen()을 통해 Windows 프로세스에 전달되며,이 파일을 끝내면 .sysin, .sysout 및 .syserr 스트림에서 .flush()를 호출 한 다음 .wait()를 호출합니다. 방법. 그게 ContextManager에 싸여있어, 나는 그것이 불려 졌음을 확신한다. 내가 뭘 할 수 있는지 잘 모르겠다. –