2014-10-08 6 views
2

Я написал API, где пользователь может направить вывод запроса SQL для:Python - Является ли stdout всегда «доступным»?

1> Excel (класс ExcelOut)
2> CSV (класс CSVOut)
3> Стандартный выход (класс Stdout)

в течение первых 2-х типов выходных, я ожидаю, что пользователю предоставить мне местоположение файла, а затем проверяет API, если место существует так называемый аргумент проверки
для стандартного вывода, я задаюсь вопросом, есть ли проверка нужна? то есть когда-либо когда-либо, когда пользователь (разработчик) API не знает, что sys.stdout не «доступен» при запуске кода?

ответ

3

Существует много причин, по которым stdout не может быть доступен для записи. Вот некоторые примеры:

# 1. Run with stdout explicitly closed: 
$ ./yourscript >&- 

# 2. Run in the background and then closing the terminal 
$ ./yourscript & exit 

# 3. No space on the device (/dev/full simulates this for testing): 
$ ./yourscript > /dev/full 

# 4. Run with a pipe that closes immediately: 
$ ./yourscript | true 

# 5. Run with a pipe that closes after the first 10 lines: 
$ ./yourscript | head -n 10 

На записи, каждая ошибка будет завернутые в IOError Python с Errno установлен в:

  1. EBADF (Bad file descriptor)

  2. EIO (Input/output error)

  3. ENOSPC (No space left on device)

  4. EPIPE (Broken pipe)

  5. Первые несколько звонков записи будут успешными, а затем EPIPE как в # 4 (других словах, работая один раз не означает, что работает всегда).

Это редко полезно попытаться определить, если стандартный вывод действителен, прежде чем начать писать на нем, хотя (основные проверки может быть сделано, например, с os.fstat). Большинство программ должны просто предполагать, что оно доступно, и грамотно обрабатывать неудачи.

+0

спасибо за ваш вклад. 1, 2, 4 и 5 кажутся преднамеренными попытками не иметь доступную версию. Может быть, я должен был быть явным в своем вопросе, но я ищу сценарии, когда пользователь не знает, что sys.stdout недоступен (причина в том, что я ожидаю, что пользователь все равно будет разработчиком). –

+0

oh и вопрос, будет ли полный диск влиять на стандартную версию, если стандартный вывод - текстовый терминал? Приносим извинения, если это глупый вопрос, но у меня создалось впечатление, что печать на экране не требует использования дискового пространства. –

+0

@name_masked Это выглядит преднамеренно, потому что это самый короткий способ воспроизвести те же условия. Мы можем [искать github] (https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#safe=off&q=stdout+%22bad+file+descriptor%22+site:github .com) для случаев реального мира 1. 2 может легко произойти при использовании сценариев xinetd и cgi. 4 и 5 могут быть связаны с невинным взглядом './yourscript | gawk -F, '{print $ 1}'> file'. –

Смежные вопросы