Вопрос или проблема
Я пытаюсь найти ошибку, связанную с выходом из программы, пока файл открыт. Для этого я интерактивно (не в IDE, а просто в терминале после запуска Python
) ввел следующий фрагмент кода в Python 3.9:
>>> import csv
>>> with open ("deleteMe", "w", newline="") as f:
... dmcsv = csv.writer(f)
... dmcsv.writerow(["это должна быть строка текста"])
... exit()
...
31
Как видите, в терминале отобразилось 31
. Почему? Что это значит?
Я работаю на macOS Sonoma (14.6.1)
Я ожидал, что Python либо silently выйдет (что происходит, когда я просто ввожу exit()
в интерактивный режим Python), либо выдаст мне сообщение об ошибке о попытке записать в закрытый файл (что дает мой исходный реальный код, и я пытаюсь это отследить).
Ответ или решение
Когда вы выполняете команду exit()
внутри блока with open(...)
, интерпретатор Python вызывает систему для завершения работы. В результате выполнения команды exit()
, Python будет завершен с кодом возврата, который равен переданному значению (в данном случае это стандартное значение 0).
Однако код возврата 31, который вы наблюдаете в терминале, указывает на то, что процесс завершился с ошибкой. Это связано с тем, что когда интерпретатор Python пытается выйти в процессе выполнения блока with
, он пытается закрыть файл, связанный с переменной f
. Так как файл был открыт для записи и мы пытаемся его закрыть, когда еще выполняется запись, это вызывает исключение, которое интерпретатор не может обработать должным образом.
Код возврата 31 — это значение, которое может быть связано с разными причинами в зависимости от операционной системы, но в вашем случае это указывает на внутреннюю ошибку Python, связанную с управлением ресурсами файла. В macOS и Unix-подобных системах принято, что код возврата ненулевых значений (в данном случае 31) используется для обозначения неудачного завершения процесса.
Таким образом, при вызове exit()
внутри блока with open(...)
вы не просто завершаете работу интерпретатора, но и приводите к сбою в процессе завершения записи в файл, что приводит к указанному коду возврата. Вместо этого вам следует избегать использования exit()
внутри контекста with
, чтобы правильно завершить все операции записи перед выходом.
Если вам нужно завершить программу, рассмотрите использование другого способа выхода, как, например, управление потоком выполнения через условные операторы или явное завершение программы после выполнения всех операций.