1

В проекте django вы получаете скрипт с именем manage.py , в котором есть несколько подкоманд, таких как runserver , migrate и т.д. Вы можете получить их список, запустив скрипт без аргументов.

Мой план состоит в том, чтобы проанализировать этот вывод и использовать его для включения завершения TAB после . manage.py , а также настроить псевдонимы, так что я могу просто набрать migr[TAB] вместо ./manage.py migrate .

Моя проблема в том, что, поскольку это Python, и он должен загружаться во все механизмы django, чтобы показать подкоманды, я каждый раз жду около половины секунды в действительно маленьком проекте. Чем больше проект, тем больше времени занимает.

Моя идея состояла в том, чтобы запустить опрос сценария, определение псевдонимов и настройку автозаполнения в фоновом режиме а-ля

(for subcommand in parse_manage_py; do alias $subcommand='./manage.py $subcommand'; done) &

Но это не устанавливает никаких переменных в родительской оболочке. Я некоторое время разбирался с export , прежде чем понял, что экспорт идет "вниз", а не "вверх".

1 ответ1

0

Один (не элегантный) подход может состоять в том, чтобы перенаправить вывод асинхронного процесса (который выполняет медленную работу) в файл и использовать содержимое этого файла только тогда, когда вам это нужно. Вы можете делать вещи в то же время. Например:

# placing everything into a function only because it easier to test
function func {
    # Test (I think that "runserver" is one of the alias you should get)
    echo -n "start: "
    alias -p|grep -q runserver && \
        echo \"runserver\" is defined || \
            echo \"runserver\" is NOT defined

    # prepare the aliases in background
    f=$(mktemp)
    ( python ./manage.py | \
          sed -n 's/^    \(.*\)/alias \1=".\/manage.py \1"/p'
      sleep 2  # simulate slow process
    ) >$f &
    slow_process_id=$!

    # here you can do things...
    echo "I'm doing thing..."
    sleep 1
    echo "...finished my things. Waiting for the aliases"

    # but if you need the aliases you must check that they are ready
    wait $slow_process_id
    source $f
    rm -f $f
    echo "Aliases ready :-)"

    # Test again
    echo -n "end: "
    alias -p|grep -q runserver && \
        echo \"runserver\" is defined || \
            echo \"runserver\" is NOT defined
}

Пожалуйста, смотрите также coproc ... command ... , но я думаю, что ее файловые дескрипторы исчезают после завершения команды.


Я также попробовал два неправильных подхода: сначала я попытался получить в своем source сценария некоторые определения псевдонимов из подпроцесса, но, конечно, эти псевдонимы не делали для вызывающей оболочки. Проблема здесь в том, что & порождает подоболочку.

Тогда я попытался использовать косвенное обращение. Проблема здесь в том, что "косвенные" переменные не являются особыми, и они отделены от вызывающей оболочки.

Спасибо G-Man за полезные комментарии.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .