Вариант использования
У меня есть пакет python, использующий группу click
для нескольких подкоманд командной строки.
В дополнение к этому, я хотел бы иметь небольшую колбу.
Другие подкоманды являются основной функцией пакета - , а не приложение для колб.
Таким образом, я бы хотел, чтобы команды колбы были вложены в их собственную группу.
Пример
Я сделал минимальный пример, чтобы продемонстрировать свою проблему - он здесь на GitHub: https://github.com/ewels/flask-subcommand-issue
Что работает
В минимальном примере я настроил установку мини-колбы, которая запускается командой fsksc_server
.
Это благодаря хуку точки входа setuptools console_scripts
в setup.py
.
Команда работает отлично, как и следовало ожидать:
$ fsksc_server --help
Usage: fsksc_server [OPTIONS] COMMAND [ARGS]...
Run the fsksc server flask app
Options:
--version Show the flask version
--help Show this message and exit.
Commands:
routes Show the routes for the app.
run Runs a development server.
shell Runs a shell in the app context.
$ fsksc_server run
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
(я не настроил никаких маршрутов, поэтому при посещении URL выдается 404, но сервер работает нормально ..)
Чтобы получить команды колбы в подкоманде click, я использовал колбу add_command
с группой колб.
Эта основная команда fsksc
. Подкоманда колбы должна быть shell
.
Цель состоит в том, чтобы fsksc shell run
запустить сервер разработки.
Команды отображаются правильно, поэтому эта часть, кажется, работает:
$ fsksc --help
Usage: fsksc [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
cmd1
cmd2
server Run the fsksc server flask app
Что не работает
При выполнении каких-либо действий подкомандой server
я получаю предупреждение об исключении NoAppException
:
$ fsksc server --help
Traceback (most recent call last):
File "/Users/ewels/miniconda2/envs/work/lib/python2.7/site-packages/Flask-1.0.2-py2.7.egg/flask/cli.py", line 529, in list_commands
rv.update(info.load_app().cli.list_commands(ctx))
File "/Users/ewels/miniconda2/envs/work/lib/python2.7/site-packages/Flask-1.0.2-py2.7.egg/flask/cli.py", line 384, in load_app
'Could not locate a Flask application. You did not provide '
NoAppException: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.
Usage: fsksc server [OPTIONS] COMMAND [ARGS]...
Run the fsksc server flask app
Options:
--version Show the flask version
--help Show this message and exit.
Commands:
routes Show the routes for the app.
run Runs a development server.
shell Runs a shell in the app context.
Попытка запустить сервер дает похожую ошибку:
$ fsksc server run
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
Usage: fsksc server run [OPTIONS]
Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.
Дрянной обходной путь
Я могу исправить это, правильно указав переменную окружения FLASK_APP
.
Тогда flask run
работает как положено:
$ export FLASK_APP=/Users/ewels/GitHub/flask-subcommand-issue/fsksc/server/app.py:create_fsksc_app
$ fsksc server run
* Serving Flask app "/Users/ewels/GitHub/flask-subcommand-issue/fsksc/server/app.py:create_fsksc_app"
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
flask run
тоже работает.
Но - Я не хочу, чтобы мои пользователи делали это!
Я также не хочу загрязнять мою основную группу команд подкомандами flask
(на самом деле у меня в подгруппе гораздо больше подкоманд).
Вопрос
Что мне нужно сделать, чтобы сделать эту работу, как я намереваюсь, без необходимости определять FLASK_APP
и как вложенную группу в щелчке?
Заранее спасибо за любую помощь!