Как я могу заставить скрипт Python «запоминать» вводимые пользователем данные?

Используйте tee (здесь предполагается система с поддержкой /dev/fd/):

{ 
  lines=$(function_call 3>&- | tee -a /dev/fd/3 | wc -l)
} 3>&1
if [ "$lines" -gt 1 ];  then
  do_stuff
fi

В Linux со странной реализацией /dev/fd/, если stdout перенаправляется в файл, вывод будет вставлен в конец этого файла, даже если текущее положение stdout в сценарии в этом файле не в конце (в общем, это нормально, так как редко когда stdout идет внутрь файла).

Альтернативно, вы можете сделать

{ 
  lines=$(function_call 3>&- | sed -ne 'w /dev/fd/3' -e '$=')
} 3>&1

Или:

{ 
  lines=$(function_call 3>&- | awk '{print > "/dev/fd/3"}; END {print NR}')
} 3>&1

(учтите, что в зависимости от реализации sed или awk, это может дать на один больше, чем wc -l, если function_call выводит дополнительные данные после последнего символа новой строки).

3
10.05.2016, 20:39
3 ответа

Если вы обслуживаете программу, заставьте ее хранить историю. В Python используйте библиотеку readline и сохраните в ней файл истории .

Если вы не хотите изменять программу, вы можете использовать оболочку, такую ​​как rlwrap .

rlwrap -H ~/.myprogram.history myprogram
6
27.01.2020, 21:09

Для такого рода вещей вы хотите использовать какой-то файл конфигурации. Обычно для этого достаточно точечного файла в домашнем каталоге пользователя.

3
27.01.2020, 21:09

Вы должны хранить вашу информацию в файле, расположение которого соответствует XDG Base Directory Specification.

Поскольку ваш материал - это данные, а не конфигурация, вам следует проверить, существует ли переменная окружения XDG_DATA_HOME и создать файл или поддиректорию, специфичную для утилиты, в которой вы будете хранить файл. Если эта переменная окружения не существует, по умолчанию используется ~/.local/share:

base_dir = os.environ.get('XDG_DATA_HOME', 
                  os.path.join(os.environ['HOME'], '.local', 'share'))
util_data_dir = os.path.join(base_dir, util_name)
3
27.01.2020, 21:09

Теги

Похожие вопросы