Есть ли кроссплатформенный способ получения информации от Python OSError?

Например, при простой операции создания каталога я могу сделать OSError следующим образом:

(Убунту Линукс)

>>> import os
>>> os.mkdir('foo')
>>> os.mkdir('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 17] File exists: 'foo'

Теперь я могу поймать эту ошибку следующим образом:

>>> import os
>>> os.mkdir('foo')
>>> try:
...     os.mkdir('foo')
... except OSError, e:
...     print e.args
... 
(17, 'File exists')

Есть ли кросс-платформенный способ узнать, что 17 или «Файл существует» всегда будут означать одно и то же, чтобы я мог действовать по-разному в зависимости от ситуации?

(Это появилось во время другого вопрос.)


person Ali Afshar    schedule 07.11.2008    source источник


Ответы (1)


Атрибут errno ошибки должен быть одинаковым на всех платформах. Вы получите WindowsError исключения в Windows, но поскольку это подкласс OSError, тот же блок "except OSError:" его перехватит. У Windows есть свои собственные коды ошибок, и они доступны как .winerror, но атрибут .errno все равно должен присутствовать и использоваться кросс-платформенным способом.

Символические имена для различных кодов ошибок можно найти в модуле errno. Например,

import os, errno
try:
    os.mkdir('test')
except OSError, e:
    if e.errno == errno.EEXIST:
        # Do something

Вы также можете выполнить обратный поиск (чтобы узнать, какой код следует использовать) с помощью errno.errorcode. Это:

>>> errno.errorcode[17]
'EEXIST'
person Brian    schedule 07.11.2008
comment
Вероятно, хорошей идеей было бы повторно вызвать исходное исключение, если оно не было EEXIST. - person ford; 27.02.2013
comment
@ford Можете ли вы опубликовать тест ответа, если сначала существует каталог, а затем повторно вызвать ошибку после попытки создания? Все это кажется слишком сложным. В Linux я бы использовал mkdir -p ~/.config/mserve для своих целей. Однако я не уверен, что эквивалентно ~ в Windows. Трудно поверить, что у переполнения стека нет однозначного ответа для создания каталога в Python... - person WinEunuuchs2Unix; 19.08.2020
comment
Я полагаю, что на первую часть вашего вопроса здесь дан ответ: stackoverflow.com/a/600612/576932 - person ford; 11.09.2020