Лично мне нравится использовать модуль argparse
для конфигурации и читать значение по умолчанию для каждого параметра из переменной среды.Это централизует настройки и документацию в одном месте и позволяет пользователю настраивать параметры в командной строке или устанавливать и забывать их в переменных среды.Будьте осторожны при вводе паролей в командной строке, потому что другие пользователи могут видеть аргументы вашей командной строки в списке процессов.
Вот пример , в котором используются argparse
и переменные среды:
def parse_args(argv=None):
parser = ArgumentParser(description='Watch the raw data folder for new runs.',
formatter_class=ArgumentDefaultsHelpFormatter)
parser.add_argument(
'--kive_server',
default=os.environ.get('MICALL_KIVE_SERVER', 'http://localhost:8000'),
help='server to send runs to')
parser.add_argument(
'--kive_user',
default=os.environ.get('MICALL_KIVE_USER', 'kive'),
help='user name for Kive server')
parser.add_argument(
'--kive_password',
default=SUPPRESS,
help='password for Kive server (default not shown)')
args = parser.parse_args(argv)
if not hasattr(args, 'kive_password'):
args.kive_password = os.environ.get('MICALL_KIVE_PASSWORD', 'kive')
return args
Установка этих переменных среды может быть немного запутанной, особенно для системных служб.Если вы используете systemd, посмотрите на сервисный блок и будьте осторожны, используя EnvironmentFile
вместо Environment
для любых секретов.Environment
значения могут быть просмотрены любым пользователем с помощью systemctl show
.
Я обычно делаю значения по умолчанию полезными для разработчика, работающего на его рабочей станции, чтобы они могли начать разработку без изменения какой-либо конфигурации.
Другой вариант - поместить параметры конфигурации в файл settings.py
, и просто будьте осторожны, чтобы не передать этот файл в систему контроля версий.Я часто фиксирую файл settings_template.py
, который пользователи могут копировать.
Если ваши настройки настолько сложны / гибки, что переменные среды или файл настроек становятся беспорядочными, то я бы преобразовал проект в библиотеку с API,Вместо настроек пользователи затем пишут скрипт, который вызывает ваш API.Вам также не нужно прилагать усилия для размещения вашей библиотеки на PyPI.pip
можно установить, например, из GitHub репозитория .