2017-01-11 6 views
0

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

Используя следующие отрезала

with open('test', 'w') as fid: 
    fid.write('a') 
    1/0 

In [1]: %run test.py 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 
***/test.py in <module>() 
     1 with open('test', 'w') as fid: 
     2   fid.write('a') 
----> 3   1/0 

ZeroDivisionError: division by zero 

In [2]: %debug 
***/test.py(3)<module>() 
     1 with open('test', 'w') as fid: 
     2   fid.write('a') 
----> 3   1/0 

ipdb> fid.write('b') 
*** ValueError: I/O operation on closed file. 

должен пояснить, что я имею в виду. Я действительно понимаю, что закрытие дескриптора файла независимо от того, что является видом точки контекстного менеджера file. Однако, поскольку stacktrace сохранен IPython (5.1), должно быть возможно открыть файл в том же месте - при условии, что файл не был изменен тем временем.

ответ

0

Это должно быть. Использование with open(filename, access_mode, buffering) as var должно соответствовать immediately close the file после выполнения всех операторов. Из Python Docs:

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

Акцент мой. Итак, вам придется открыть файл старомодным способом:

file_name = open("test", "w") 
# insert rest of statements here 
file_name.close() 
+0

Возможно, я не очень хорошо объяснил, что я имел в виду. Я делаю сейчас, это точка контекст-менеджера, поэтому я не хочу его оставлять. Однако для целей отладки это действительно плохо. Мой вопрос: как я могу открыть файл в том же месте. Я бы предположил, что это возможно, поскольку вся информация защищена в стеке. –