#python
#python
Вопрос:
Я просто пробовал простой код:
import sys
def main():
print "this is main"
return "string1"
if __name__ == "__main__":
sys.exit(main())
И когда я запускаю этот фрагмент кода, он выдает случайный результат, иногда «string1» перед «this is main», а иногда и после него.
Почему это так?
2 примера выходных данных:
это главное
string1
Процесс завершен с кодом выхода 1
============
string1
это главное
Процесс завершен с кодом выхода 1
Комментарии:
1. Как это вообще печатается? Зачем
sys.exit()
принимать строку в качестве параметра?2.@cricket_007 Смотрите Документацию
sys.exit
docs.python.org/2/library/sys.html#sys.exit3. @timarko — Мой вопрос был направлен на OP, а не столько на мое непонимание
4. Полный ответ будет зависеть от нескольких факторов, не упомянутых в вопросе: какую операционную систему вы используете, как вы запускаете программу и куда направляются стандартный вывод и стандартная ошибка (хотя похоже, что ответ на последний вопрос — это терминал). Все это влияет на то, как буферизуются стандартный вывод и стандартная ошибка (если они вообще есть).
5. @chepner, я использую ОС win64. И да, похоже, что причиной такого поведения является буферизация stdout и stderr.
Ответ №1:
sys.exit
принимает возвращаемое значение main()
и выдает его как код ошибки приложения. Значение обычно должно быть числовым, хотя Python здесь немного сложнее.
Из документации sys.exit:
Если передается объект другого типа, None эквивалентно передаче нуля, а любой другой объект печатается в stderr и приводит к коду выхода 1. В частности, sys.exit(«некоторое сообщение об ошибке») — это быстрый способ выйти из программы при возникновении ошибки.
Итак, что может происходить, это гонка между сбросом stdout
(for print
) и выводом в stderr
, как указано выше.
Я предлагаю вам попробовать выполнить сброс stdout
после print
( sys.stdout.flush
) и посмотреть, получите ли вы таким образом согласованный результат.
Комментарии:
1.Смотрите Документацию
sys.exit
docs.python.org/2/library/sys.html#sys.exit2. @EliBendersky Спасибо. У меня возникла идея, лежащая в основе этого поведения. Я попробовал sys.stdout. flush() после инструкции print, но все то же поведение.
3. @prateekgoyal: я бы не рекомендовал полагаться на порядок буферизации разных потоков. Не передавайте строки в
sys.exit