簡體   English   中英

當我沒有文件標識符時,如何在python中關閉文件

[英]How do I close files in python when I haven't got the file identifiers

我發現自己無法在Python中打開新文件。 當我用ls -l /proc/PID/fd檢查時,我看到了為Python進程打開的大量文件。 我正在使用的模塊顯然打開了很多文件而沒有關閉它們。

我期待通過刪除與打開文件的模塊相關聯的對象來關閉文件,但沒有任何反應。

我也期待在垃圾收集中的某處看到文件對象,但我沒有看到任何類似於打開文件的內容:

for obj in gc.get_objects():
    if hasattr(obj, 'read'):
        print(obj)

退出Python時文件消失了。

問題很可能是那些文件描述符在沒有與Python對象關聯的情況下泄漏。 Python無法看到與Python對象無關的實際文件描述符(OS資源)。 如果它們與Python對象相關聯,Python會在收集垃圾時關閉它們。 或者,第三方庫自己跟蹤文件描述符。

您可以在普通整數上使用os.close來關閉關聯的文件描述符。 如果您知道要保持打開哪些文件描述符(通常是stdin / stdout / stderr,它們分別為0,1和2,可能還有其他幾個),您可以關閉0到65535之間的所有其他整數,或者只是那些在/proc/<pid>/fd

import os

KEEP_FD = set([0, 1, 2])

for fd in os.listdir(os.path.join("/proc", str(os.getpid()), "fd")):
    if int(fd) not in KEEP_FD:
        try:
            os.close(int(fd))
        except OSError:
            pass

不過,這是一個非常邪惡的黑客。 更好的解決方案是修復第三方庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM