Что может привести к "IOError: [Errno 9] Bad file descriptor" во время os.system()?

Я использую научное программное обеспечение, включая скрипт Python, который вызывает os.system() который используется для запуска другой научной программы. Пока подпроцесс работает, Python в какой-то момент выдает следующее:

close failed in file object destructor:
IOError: [Errno 9] Bad file descriptor

Я считаю, что это сообщение печатается одновременно с os.system() возвращается.

Мои вопросы сейчас:

Какие условия могут привести к этому типу IOError? Что это значит? Что это значит для подпроцесса, который был вызван os.system()?

3 ответа

Решение

Вы получите это сообщение об ошибке, если файл Python был закрыт "извне", то есть не из объекта файла close() метод:

>>> f = open(".bashrc")
>>> os.close(f.fileno())
>>> del f
close failed in file object destructor:
IOError: [Errno 9] Bad file descriptor

Линия del f удаляет последнюю ссылку на файл объекта, вызывая его деструктор file.__del__ быть названным. Внутреннее состояние объекта файла указывает, что файл все еще открыт, так как f.close() никогда не вызывался, поэтому деструктор пытается закрыть файл. Впоследствии ОС выдает ошибку из-за попытки закрыть файл, который не открыт.

С момента реализации os.system() не создает никаких файловых объектов Python, не похоже, что system() вызов является источником ошибки. Может быть, вы могли бы показать немного больше кода?

Вы можете получить эту ошибку, если вы используете неправильный режим при открытии файла. Например:

    with open(output, 'wb') as output_file:
        print output_file.read()

В этом коде я хочу прочитать файл, но я использую режим wb вместо r или же r+

Вы можете получить эту ошибку, если в вашем рабочем каталоге включена защита от программ-вымогателей. Windows не позволяет никаким сторонним приложениям вносить изменения в файлы, если каталог защищен защитой от программ-вымогателей, которая поставляется с Windows. Вы можете исправить это, перейдя в «Безопасность Windows -> Защита от вирусов и угроз -> Управление защитой от программ-вымогателей -> Разрешить приложению через контролируемый доступ к папке».

Затем добавьте «Python[версия].exe», нажав «Добавить разрешенное приложение».

Другие вопросы по тегам