GCP: если __name__ == '__main__' НЕ РАБОТАЕТ - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь запустить приложение Python в Google Cloud Run на GCP, и в коде содержится оператор

if __name__ == '__main__':

. По какой-то причине код после этого оператора не выполняется, и

print(__name__ == '__main__')

возвращает 'False', а

print(__name__)

возвращает 'main'.

Когда я запускаю код в блокноте Jupyter,

print(__name__ == '__main__')

возвращает 'True', а

print(__name__)

возвращает '__main__'.

Почему (i) print(__name__ == '__main__') возвращает 'False' и (ii) print(__name__) возвращает 'main', когда код запускается в Google Cloud Run? И как можно решить эту проблему?

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Значение __name__ зависит от того, как используется файл. Рассмотрим следующий файл с именем test.py:

# test.py
print(__name__)

Если мы запустим файл напрямую, мы получим:

$ python test.py
__main__

Это выведет "__main__", поскольку интерпретатор запускает файл в качестве основной программы.

Вместо этого, если мы импортируем файл:

$ python -c "import test"
test

Будет напечатано test, поскольку это имя импортируемого модуля.

Я предполагаю, что у вас есть приложение Cloud Run в файле с именем main.py и что вы используете gunicorn в качестве HTTP-сервера. Поэтому, когда вы указываете что-то вроде:

CMD exec gunicorn --bind :$PORT main:app

Это говорит gunicorn об импорте переменной app из файла main.py, и, таким образом, __name__ всегда будет "main" в этом файле .

В зависимости от того, что вы делаете в этом блоке if __name__ == "__main__", вы можете полностью исключить эту проверку и запускать код внутри нее всякий раз, когда вместо этого импортируется файл.

1 голос
/ 21 февраля 2020

Перед выполнением кода интерпретатор Python читает исходный файл и определяет несколько специальных переменных / глобальных переменных, таких как глобальная переменная __name__.

  • Если * Интерпретатор 1034 * запускает этот модуль (исходный файл) в качестве основной программы, он задает специальной переменной __name__ значение “__main__”.

  • Если этот файл импортируется из другого модуля, __name__ будет присвоено имя модуля.

Имя модуля доступно в качестве значения для __name__ глобальной переменной.

Модуль - это файл, содержащий Python определений и операторов.

Имя файла - это имя модуля с добавленным суффиксом .py.

Здесь вы можете найти несколько примеров для понимания этого процесса.

Это может объяснить, почему при запуске из записной книжки Jupyter он возвращает значение «истина», а при запуске приложения в Cloud Run возвращает «ложь».

Не могли бы вы указать как выполняется сценарий и предоставить код по запросу @John Hanley?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...