Файл открыт и записан, не удается получить путь исключения для выполнения - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь корректно обработать условие, когда запрашивается слишком много памяти трассировки, что приводит к сбою выделения памяти. Вот мой скрипт на python, который был извлечен из основного скрипта и сводится только к этой проблеме (20-секундный сон просто для того, чтобы я мог наблюдать за выделением памяти и свободными шагами с помощью free -m):

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
from __future__ import print_function
from datetime import datetime
import subprocess
import os
import time
import re
import site
import signal
import sys
import getopt
import Gnuplot
from numpy import *
from decimal import *

def set_trace_buffer_size():
    """ Set trace buffer size """

    try:
       open('/sys/kernel/debug/tracing/buffer_size_kb'
                 , 'w').write(memory)
       print('path is via the non-exception route ')
    except:
        print('IO error setting trace buffer size ')
        sys.exit(2)

def free_trace_buffer():
    """ Free the trace buffer memory """

    try:
       open('/sys/kernel/debug/tracing/buffer_size_kb'
                 , 'w').write("1")
    except:
        print('IO error freeing the trace buffer memory ')
        sys.exit(2)

def signal_handler(signal, frame):
    print('  SIGINT: Forcing cleanup before exit.')
    # Free the memory
    free_trace_buffer()
    sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)

memory = "2500000"

set_trace_buffer_size()

print('Sleeping for 20 seconds')
time.sleep(int(20))

free_trace_buffer()

И я получаю это:

$ sudo ./test.py
close failed in file object destructor:
IOError: [Errno 12] Cannot allocate memory
path is via the non-exception route
Sleeping for 20 seconds
^C  SIGINT: Forcing cleanup before exit.

У меня вопрос: что я делаю неправильно, и как я могу получить его, используя путь except в случае неудачного размещения?

Полагаю, я всегда мог проверить значение после возврата, чтобы узнать, запрашивалось ли оно. При неудаче он, кажется, возвращается к предыдущему значению.

1 Ответ

0 голосов
/ 04 мая 2018

Исключение IOError возникает, когда ваш файл сбрасывается или закрывается. Ваш код не закрывает файл явным образом (он неявно закрывается, когда объект файла собирается сборщиком мусора), и поэтому ваш код не получает исключения.

Изменить это:

try:
   open(..., 'w').write(...)
except:
   ...

К этому:

try:
   with open(..., 'w') as fp:
       fp.write(...)
except:
   ...

И вы должны правильно поймать свой IOError.

Для записи, блок with в этом случае является сокращением для:

try:
   fp = open(..., 'w')
   try:
       fp.write(...)
   finally:
       fp.close()
except:
   ...

Обратите внимание на явный вызов close(), который вызовет исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...