Непонимание поведения возврата в python

#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.exit

3. @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.exit

2. @EliBendersky Спасибо. У меня возникла идея, лежащая в основе этого поведения. Я попробовал sys.stdout. flush() после инструкции print, но все то же поведение.

3. @prateekgoyal: я бы не рекомендовал полагаться на порядок буферизации разных потоков. Не передавайте строки в sys.exit