проверьте, какие файлы открыты в Python

Я получаю ошибку в программе, которая, как предполагается, работает в течение долгого времени, что слишком много файлов открыты. Есть ли какой-либо способ, которым я могу отслеживать, которых файлы открыты, таким образом, я могу иногда распечатывать тот список и видеть, где проблема?

55
задан Claudiu 7 January 2010 в 20:57
поделиться

5 ответов

В конце концов я обернул встроенный файловый объект в точку входа моей программы. Я обнаружил, что не закрываю свои регистраторы.

import io
import sys
import builtins
import traceback
from functools import wraps


def opener(old_open):
    @wraps(old_open)
    def tracking_open(*args, **kw):
        file = old_open(*args, **kw)

        old_close = file.close
        @wraps(old_close)
        def close():
            old_close()
            open_files.remove(file)
        file.close = close
        file.stack = traceback.extract_stack()

        open_files.add(file)
        return file
    return tracking_open


def print_open_files():
    print(f'### {len(open_files)} OPEN FILES: [{", ".join(f.name for f in open_files)}]', file=sys.stderr)
    for file in open_files:
        print(f'Open file {file.name}:\n{"".join(traceback.format_list(file.stack))}', file=sys.stderr)


open_files = set()
io.open = opener(io.open)
builtins.open = opener(builtins.open)
40
ответ дан 26 November 2019 в 17:44
поделиться

В Linux вы можете посмотреть на содержимое /proc/self/fd:

$ ls -l /proc/self/fd/
total 0
lrwx------ 1 foo users 64 Jan  7 15:15 0 -> /dev/pts/3
lrwx------ 1 foo users 64 Jan  7 15:15 1 -> /dev/pts/3
lrwx------ 1 foo users 64 Jan  7 15:15 2 -> /dev/pts/3
lr-x------ 1 foo users 64 Jan  7 15:15 3 -> /proc/9527/fd
23
ответ дан 26 November 2019 в 17:44
поделиться

В Linux можно использовать lsof, чтобы показать все файлы, открытые процессом.

.
9
ответ дан 26 November 2019 в 17:44
поделиться

В Windows можно использовать Проводник процесса для отображения всех файловых дескрипторов, принадлежащих процессу.

.
5
ответ дан 26 November 2019 в 17:44
поделиться

Я полагаю, что у вас утечка дескрипторов файлов. Вероятно, вы захотите просмотреть свой код, чтобы убедиться, что вы закрываете все открываемые файлы.

.
1
ответ дан 26 November 2019 в 17:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: