Tôi có một chương trình Python cần tạo một tệp tạm thời có tên sẽ được mở và đóng vài lần trong suốt chương trình và sẽ bị xóa khi chương trình thoát. Thật không may, không ai trong số các tùy chọn trong tempfile
dường như làm việc:Làm cách nào để tạo tệp tạm thời có tên trên các cửa sổ bằng Python?
TemporaryFile
không có một cái tên có thể nhìn thấyNamedTemporaryFile
tạo ra một đối tượng tập tin như thế nào. Tôi chỉ cần một tên tập tin. Tôi đã cố gắng đóng đối tượng nó trả về (sau khi thiết lậpdelete = False
) nhưng tôi nhận được lỗi dòng khi tôi cố gắng để mở tập tin sau này.SpooledTemporaryFile
không có tên hiển thịmkstemp
trả về cả đối tượng tệp mở và tên; nó không đảm bảo các tập tin bị xóa khi chương trình thoátmktemp
trả về tên tập tin, nhưng không đảm bảo các tập tin bị xóa khi chương trình thoát
Tôi đã cố gắng sử dụng mktemp
trong vòng người quản lý ngữ cảnh, như vậy:
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()
... nhưng điều đó mang lại cho tôi WindowsError(32, 'The process cannot access the file because it is being used by another process')
. Tên tệp được sử dụng bởi một tiến trình mà chương trình của tôi sinh ra, và mặc dù tôi đảm bảo rằng quá trình đó kết thúc trước khi tôi thoát ra, dường như có một tình trạng chạy đua ngoài tầm kiểm soát của tôi.
Cách tốt nhất để giải quyết vấn đề này là gì?
Tôi không cần phải lo lắng về vấn đề bảo mật tại đây; đây là một phần của một mô-đun thử nghiệm, do đó, một người nào đó bất chính nhất có thể làm là làm cho các bài kiểm tra đơn vị của chúng tôi thất bại giả. Kinh dị!
Các vấn đề an ninh không ảnh hưởng đến chương trình bằng cách sử dụng tập tin tạm thời, chúng ảnh hưởng đến toàn bộ hệ thống các tập tin tạm thời được tạo ra trên (ví dụ symlinking đến một quan trọng sau khi nó đã được tạo ra). –
Bạn có chắc chắn rằng tất cả các đối tượng tệp đang mở tệp tạm thời được đóng đúng cách không? – user49117
Tên tệp được chuyển đến một tiến trình Windows thông qua Popen(), và khi tôi hoàn thành nó, tôi gọi .flush() trên các dòng .sysin, .sysout và .syserr rồi gọi .wait() trên quá trình. Đó là gói trong một ContextManager, vì vậy tôi chắc chắn nó được gọi. Tôi không chắc mình có thể làm gì khác. –