Объятие не может прочитать переменные окружения

Я пытаюсь использовать переменные окружения с объятиями. Однако я не могу.

Первый шаг, как я сделал:

$ export INTEGER=5

У меня есть это в моем основном коде:

import hug
import os


@hug.get('/')
def foo():
   var = os.environ['INTEGER']
   return {'INT':var}

когда я выполню

sudo hug -p 80 -f foo.py

и перейти к localhost/

Ошибка:

Traceback (most recent call last):
  File "/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/wsgiref/handlers.py", line 137, in run
    self.result = application(self.environ, self.start_response)
  File "/Users/Andres/.local/share/virtualenvs/botCS-HzHaMvtf/lib/python3.6/site-packages/falcon/api.py", line 244, in __call__
    responder(req, resp, **params)
  File "/Users/Andres/.local/share/virtualenvs/botCS-HzHaMvtf/lib/python3.6/site-packages/hug/interface.py", line 734, in __call__
    raise exception
  File "/Users/Andres/.local/share/virtualenvs/botCS-HzHaMvtf/lib/python3.6/site-packages/hug/interface.py", line 709, in __call__
    self.render_content(self.call_function(input_parameters), request, response, **kwargs)
  File "/Users/Andres/.local/share/virtualenvs/botCS-HzHaMvtf/lib/python3.6/site-packages/hug/interface.py", line 649, in call_function
    return self.interface(**parameters)
  File "/Users/Andres/.local/share/virtualenvs/botCS-HzHaMvtf/lib/python3.6/site-packages/hug/interface.py", line 100, in __call__
    return __hug_internal_self._function(*args, **kwargs)
  File "repro.py", line 7, in foo
    var = os.environ['INTEGER']
  File "/Users/Andres/.local/share/virtualenvs/botCS-HzHaMvtf/bin/../lib/python3.6/os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'INTEGER'

что случилось?

2 ответа

Решение

Ваша проблема в том, что вы работаете hug как sudo (что-то, что вы никогда не должны делать между прочим.) и добавление переменной среды как вы (обычный пользователь).

Я предполагаю, что вы работаете как sudo, потому что вы хотите работать на порте 80. Запустите его скорее на порту 8080.


Так что это работает:

ракушка:

export INTEGER=5

код Python:

import os

@hug.get('/')
def view():
    print(os.environ['INTEGER'])  # or print(os.environ.get('INTEGER'))

ракушка:

hug -f app.py -p 8080

os.environ['INTEGER'] не удается, потому что os.environ не имеет ключа называетсяINTEGER".

Вы можете использовать этот код и предоставить необязательный параметр по умолчанию в качестве второго аргумента get:

os.environ.get("INTEGER", 0)

Это вернется 0 (или любой другой тип по умолчанию) INTEGER не найден.

Причина INTEGER отсутствует, должно быть связано с тем, где вы определили свою переменную bash. Он должен быть "в области видимости" или доступен сценарию в зависимости от того, где вы запускаете сценарий.

Другие вопросы по тегам