Как отключить новую функцию истории в Python 3.4?

Начиная с обновления до Python 3.4, все интерактивные команды записываются в ~/.python_history . Я не хочу, чтобы Python создавал или записывал в этот файл.

Создание символической ссылки на /dev/null не работает, Python удаляет файл и воссоздает его. В документации предлагается удалить sys.__interactivehook__ , но это также удаляет завершение табуляции. Что нужно сделать, чтобы отключить запись этого файла истории, но сохранить сохранение табуляции?

Дополнительные детали:

  • Distro: Arch Linux x86_64
  • readline 6.3-3
  • python 3.4.0-2

6 Solutions collect form web for “Как отключить новую функцию истории в Python 3.4?”

Это работает для меня.

Создание файла ~/.pythonrc :

 import os import atexit import readline readline_history_file = os.path.join(os.path.expanduser('~'), '.python_history') try: readline.read_history_file(readline_history_file) except IOError: pass readline.set_history_length(0) atexit.register(readline.write_history_file, readline_history_file) 

Затем экспортируйте его:

 export PYTHONSTARTUP=~/.pythonrc 

Пока это не будет исправлено в Python, вы можете сделать это в системах UNIX:

 rm ~/.python-history mkdir ~/.python-history sudo chattr +i ~/.python-history || sudo chflags simmutable ~/.python-history 

После этого вы будете получать

Ошибка в atexit._run_exitfuncs:

IsADirectoryError: [Errno 21] Является ли каталог

каждый раз, когда вы завершаете оболочку python. Статус выхода по-прежнему будет 0 .

Обратите внимание: если вы оставите это как файл, вам нужно создать и сделать неизменным другой файл, ~/.python_history

Поместите следующее в файл и установите для него PYTHONSTARTUP (или вызовите файл sitecustomize.py и сделайте его доступным из PYTHONPATH )

 import readline import atexit import sys sys.__interactivehook__() atexit.unregister(readline.write_history_file) 

Таким образом, у вас все равно будет доступ к завершению табуляции и предыдущей истории, но вводимые команды не будут добавлены в файл истории.

Чтобы Python не писал ~/.python_history , отключите hook, который активирует эту функцию:

 import sys # Disable history (...but also auto-completion :/ ) if hasattr(sys, '__interactivehook__'): del sys.__interactivehook__ 

Если вы хотите включить выполнение табуляции и отключить функцию истории, вы можете адаптировать код site.enablerlcompleter . Напишите следующий код в ~/.pythonrc и установите для export PYTHONSTARTUP=~/.pythonrc в свою оболочку.

 import sys def register_readline_completion(): # rlcompleter must be loaded for Python-specific completion try: import readline, rlcompleter except ImportError: return # Enable tab-completion readline_doc = getattr(readline, '__doc__', '') if readline_doc is not None and 'libedit' in readline_doc: readline.parse_and_bind('bind ^I rl_complete') else: readline.parse_and_bind('tab: complete') sys.__interactivehook__ = register_readline_completion 

Вот мой метод (который оказался в основном более надежной и питонической версией метода berdario). Он отключает запись только в .python_history , но не читает его, если он существует, или добавляет новые строки в историю текущего экземпляра. Я рекомендую сохранить его как site-packages/sitecustomize.py , потому что site – это модуль, который как пишет в .python_history и импортирует sitecustomize если он существует , хотя именовать его чем-то другим и указывать на него с помощью PYTHONSTARTUP .

 import sys oldhook = getattr(sys, '__interactivehook__', None) def newhook(): import readline, atexit oldhook() atexit.unregister(readline.write_history_file) if oldhook: sys.__interactivehook__ = newhook 

Другое решение ~ / .pythonrc:

 import readline readline.write_history_file = lambda *args: None 
  • Как вручную удалить urllib, urllib2, запрашивает пакеты python?
  • Как успешно выйти из сценария оболочки, чтобы подпроцесс python считал, что он успешно выходит?
  • символические ссылки python (также для себя) в usr / bin
  • Почему работает «echo os.system (« / bin / bash »)?
  • Могу ли я изменить владельца туннеля после его создания?
  • Пакет python3-pyds9 отсутствует в Jessie
  • Программа, запускаемая из udev, не может открыть окно
  • Su как root и запустить команду в одной строке
  • Получение обновления об ошибке CentOS 6.7
  • Постоянное выполнение команды терминала
  • Разрешения python && unix (gitlab)
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.