Python3 не принимает переменные окружения, установленные исходной командой - PullRequest
0 голосов
/ 01 февраля 2019

Я написал файл конфигурации следующим образом:

bucket_name=some-bucket

Я запускаю команду source config_de_local, где config_de_local - это имя файла, в котором хранятся переменные, которые должны быть установлены.

Затем я запускаю команду: echo $bucket_name и получаю o / p: some-bucket.Тем не менее, файл конфигурации по-прежнему не может импортировать любую переменную, он утверждает, что все равно NULL.Вот как я импортирую переменную: bucket_name = os.getenv('bucket_name', '')

Однако в терминале, если я запускаю команду: export bucket_name=some-bucket, а затем в оболочке Python3, я запускаю строку: print(os.getenv('bucket_name','')) Я получаюжелаемый вывод.

Примечание: я использую Python3 в virtualenv;Я активирую его и затем устанавливаю переменные env через source и export.

1 Ответ

0 голосов
/ 01 февраля 2019

Причина, по которой это не работает, заключается в том, что неэкспортированные переменные среды будут видны только текущему процессу (в вашем случае это Bash), но не дочерним процессам (например, Python).Экспорт действительно необходим, или переменная может быть специально указана при запуске Python следующим образом:

fots ~ $ bucket_name=some-bucket python3
Python 3.7.2 (default, Jan 13 2019, 12:50:01) 
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getenv('bucket_name', '')
'some-bucket'

В случае, если вы хотите их получить, простое решение состоит в том, чтобы экспортировать эти переменные в сценарий, который вы используете(который, в свою очередь, будет экспортировать их в текущую оболочку).

например,

fots ~ $ cat config_de_local
export bucket_name=some-bucket
fots ~ $ source config_de_local
fots ~ $ python3
Python 3.7.2 (default, Jan 13 2019, 12:50:01) 
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getenv('bucket_name', '')
'some-bucket'

Существуют различные способы передачи этих экспортированных переменных среды в ваше приложение.Простой сценарий оболочки, обертывающий программу, будет работать (как вы делаете).Этот сценарий активирует virtualenv, а затем отправит файл.

В качестве альтернативы, если приложение является демоном, работающим в фоновом режиме, создание службы systemd или supervisor также будет работать, так как вы также можете указать переменные среды вопределение сервиса.

Надеюсь, это поможет!
Фотис

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